From dd803dd62973e82dfeaae52e0971731d1c76b647 Mon Sep 17 00:00:00 2001 From: akageun Date: Mon, 29 Jul 2024 22:59:11 +0900 Subject: [PATCH 01/27] Cluster Query Command (#87) --- .../cluster/query/ClusterQueryCommander.java | 3 +- .../core/domain/cluster/query/QueryDTO.java | 10 +-- .../kr/hakdang/cassdio/IntegrationTest.java | 7 ++ .../query/ClusterQueryCommanderTest.java | 68 +++++++++++++++++++ 4 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommanderTest.java diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommander.java index 484a56c9..e0ef46a0 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommander.java @@ -89,7 +89,6 @@ public QueryDTO.ClusterQueryCommanderResult execute( builder.queryTrace(cassdioQueryTrace); } - return - builder.build(); + return builder.build(); } } diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/query/QueryDTO.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/query/QueryDTO.java index 8eaf243c..cc42c973 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/query/QueryDTO.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/query/QueryDTO.java @@ -38,7 +38,7 @@ public ClusterQueryCommanderArgs( String cursor, Integer pageSize, Integer timeoutSeconds, - int consistencyLevelProtocolCode, + Integer consistencyLevelProtocolCode, boolean trace ) { if (pageSize == null || pageSize <= 0) { @@ -57,15 +57,17 @@ public ClusterQueryCommanderArgs( throw new RuntimeException("timeout 60 over"); } - DefaultConsistencyLevel level = DefaultConsistencyLevel.fromCode(consistencyLevelProtocolCode); - this.keyspace = keyspace; this.query = query; this.cursor = cursor; this.pageSize = pageSize; this.timeoutSeconds = timeoutSeconds; - this.consistencyLevel = level; + this.trace = trace; + + if (consistencyLevelProtocolCode != null) { + this.consistencyLevel = DefaultConsistencyLevel.fromCode(consistencyLevelProtocolCode); + } } } diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/IntegrationTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/IntegrationTest.java index 0d47a6bb..5e7a5b0f 100644 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/IntegrationTest.java +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/IntegrationTest.java @@ -27,4 +27,11 @@ protected CqlSession makeSession() { .withLocalDatacenter("dc1") .build(); } + protected CqlSession makeSession(String keyspaceName) { + return CqlSession.builder() + .addContactPoint(new InetSocketAddress("127.0.0.1", 29042)) + .withLocalDatacenter("dc1") + .withKeyspace(keyspaceName) + .build(); + } } diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommanderTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommanderTest.java new file mode 100644 index 00000000..94f0d14f --- /dev/null +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommanderTest.java @@ -0,0 +1,68 @@ +package kr.hakdang.cassdio.core.domain.cluster.query; + +import com.datastax.oss.driver.api.core.CqlSession; +import kr.hakdang.cassdio.IntegrationTest; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.util.Assert; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@Slf4j +class ClusterQueryCommanderTest extends IntegrationTest { + + private final ClusterQueryCommander clusterQueryCommander; + + ClusterQueryCommanderTest( + ClusterQueryCommander clusterQueryCommander + ) { + this.clusterQueryCommander = clusterQueryCommander; + } + + @Value("${cassdio.test-cassandra.keyspace}") + private String keyspaceName; + + private final static String TABLE_NAME = "test_table_1"; + + @Test + void queryTest() { + //GIVEN + QueryDTO.ClusterQueryCommanderArgs args = QueryDTO.ClusterQueryCommanderArgs.builder() + .query(String.format("SELECT * FROM %s.%s", keyspaceName, TABLE_NAME)) + .build(); + + try (CqlSession session = makeSession()) { + + //WHEN + QueryDTO.ClusterQueryCommanderResult result = clusterQueryCommander.execute(session, args); + + //THEN + assertThat(result).isNotNull(); + assertThat(result.getRows()).isNotNull(); + } + + } + + @Test + void useKeyspaceTest() { + //GIVEN + QueryDTO.ClusterQueryCommanderArgs args = QueryDTO.ClusterQueryCommanderArgs.builder() + .query(String.format("SELECT * FROM %s", TABLE_NAME)) + .keyspace(keyspaceName) + .build(); + + try (CqlSession session = makeSession()) { + + //WHEN + QueryDTO.ClusterQueryCommanderResult result = clusterQueryCommander.execute(session, args); + + //THEN + assertThat(result).isNotNull(); + assertThat(result.getRows()).isNotNull(); + } + + } +} From ec7a0545749ed0b110dc5c3ad351eace71bdd85e Mon Sep 17 00:00:00 2001 From: akageun Date: Mon, 29 Jul 2024 22:59:32 +0900 Subject: [PATCH 02/27] Build Script (#88) --- build.sh | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100755 build.sh diff --git a/build.sh b/build.sh new file mode 100755 index 00000000..da447cb6 --- /dev/null +++ b/build.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +echo "Cassdio Build!! Start!!!!" + +./gradlew :cassdio-web:clean :cassdio-web:build -Pfrontend=true + +echo "Cassdio Build!! Complete!!!" From 35342d86c031471b3430ed9f9e4253aab3707092 Mon Sep 17 00:00:00 2001 From: akageun Date: Tue, 30 Jul 2024 18:42:28 +0900 Subject: [PATCH 03/27] Logback file (#89) --- .../src/main/resources/application.yml | 2 +- .../src/main/resources/logback-spring.xml | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 cassdio-web/src/main/resources/logback-spring.xml diff --git a/cassdio-web/src/main/resources/application.yml b/cassdio-web/src/main/resources/application.yml index b33dde39..af3bcdab 100644 --- a/cassdio-web/src/main/resources/application.yml +++ b/cassdio-web/src/main/resources/application.yml @@ -1,4 +1,4 @@ -spring.profiles.default: local # TODO: local/alpha/beta/release 이렇게 나눠두고 나중에 기본으로 release로 변경? +spring.profiles.default: release spring.config: import: - classpath:/application-core.yml diff --git a/cassdio-web/src/main/resources/logback-spring.xml b/cassdio-web/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..115fadfb --- /dev/null +++ b/cassdio-web/src/main/resources/logback-spring.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + + + + + + + ${log.path}/${log.filename.prefix}.log + + + + ${log.path}/archive/year_%d{yyyy, aux}/month_%d{MM,aux}/${log.filename.prefix}.%d{yyyy-MM-dd}.%i.log.gz + + 10MB + 3 + + + + ${CONSOLE_LOG_PATTERN} + + + + + + + + + From 34dd5098333c80e7189a856a6122456f9f7f89b6 Mon Sep 17 00:00:00 2001 From: akageun Date: Tue, 30 Jul 2024 18:42:46 +0900 Subject: [PATCH 04/27] UI Refactoring 4 (#90) --- .../webapp/src/pages/cassdio-home-page.js | 6 +-- .../pages/cluster/cluster-dashboard-page.js | 6 +-- .../main/webapp/src/remotes/bootstrapApi.js | 2 +- .../src/main/webapp/src/routers/router.js | 37 ++++++------------- 4 files changed, 16 insertions(+), 35 deletions(-) diff --git a/cassdio-web/src/main/webapp/src/pages/cassdio-home-page.js b/cassdio-web/src/main/webapp/src/pages/cassdio-home-page.js index 254e5f42..2e9cfef5 100644 --- a/cassdio-web/src/main/webapp/src/pages/cassdio-home-page.js +++ b/cassdio-web/src/main/webapp/src/pages/cassdio-home-page.js @@ -1,11 +1,7 @@ -import {Link} from "react-router-dom"; +import {useEffect} from "react"; import CassdioSidebar from "../components/layout/cassdio-sidebar"; - import ClusterList from "../components/cluster/cluster-list"; -import {useEffect} from "react"; -import {useCassdioDispatch, useCassdioState} from "../context/cassdioContext"; -import CassdioHelper from "../utils/cassdioHelper"; import HomeSidebarLink from "../components/home-sidebar-link"; const CassdioHomePage = () => { diff --git a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-dashboard-page.js b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-dashboard-page.js index e5f2d77e..1bf3c491 100644 --- a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-dashboard-page.js +++ b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-dashboard-page.js @@ -1,9 +1,9 @@ import {Link, useParams} from "react-router-dom"; import {useEffect, useState} from "react"; -import ClusterKeyspaceBreadcrumb from "../../components/cluster/cluster-keyspace-breadcrumb"; -import Spinner from "../../components/common/spinner"; +import ClusterKeyspaceBreadcrumb from "components/cluster/cluster-keyspace-breadcrumb"; +import Spinner from "components/common/spinner"; import axios from "axios"; -import useCassdio from "../../hooks/useCassdio"; +import useCassdio from "hooks/useCassdio"; const ClusterDashboardPage = ({}) => { diff --git a/cassdio-web/src/main/webapp/src/remotes/bootstrapApi.js b/cassdio-web/src/main/webapp/src/remotes/bootstrapApi.js index 07bae12f..01ab3a7d 100644 --- a/cassdio-web/src/main/webapp/src/remotes/bootstrapApi.js +++ b/cassdio-web/src/main/webapp/src/remotes/bootstrapApi.js @@ -1,7 +1,7 @@ import axiosInstance from "utils/axiosUtils"; export default async function bootstrapApi( - {} + ) { try { const response = await axiosInstance({ diff --git a/cassdio-web/src/main/webapp/src/routers/router.js b/cassdio-web/src/main/webapp/src/routers/router.js index 57afefbf..50017d17 100644 --- a/cassdio-web/src/main/webapp/src/routers/router.js +++ b/cassdio-web/src/main/webapp/src/routers/router.js @@ -1,8 +1,10 @@ import {createBrowserRouter} from "react-router-dom"; + import CassdioDefaultLayout from "components/layout/cassdio-default-layout"; -import bootstrapApi from "remotes/bootstrapApi"; -import CassdioHomePage from "pages/cassdio-home-page"; import ClusterLayout from "components/cluster/cluster-layout"; +import AdminLayout from "components/admin/admin-layout"; + +import CassdioHomePage from "pages/cassdio-home-page"; import ClusterDashboardPage from "pages/cluster/cluster-dashboard-page"; import ClusterNodesPage from "pages/cluster/cluster-nodes-page"; import ClusterClientPage from "pages/cluster/cluster-client-page"; @@ -10,18 +12,21 @@ import ClusterMetricsPage from "pages/cluster/cluster-metrics-page"; import ClusterKeyspacePage from "pages/cluster/cluster-keyspace-page"; import ClusterQueryPage from "pages/cluster/cluster-query-page"; import ClusterKeyspaceCompactionPage from "pages/cluster/cluster-keyspace-comapction-page"; -import NotFound from "pages/not-found"; -import AdminLayout from "components/admin/admin-layout"; -import AdminHomePage from "pages/admin/admin-home-page"; import ClusterTablePage from "pages/cluster/cluster-table-page"; import ClusterMonitoringDashboardPage from "pages/cluster/cluster-monitoring-dashboard-page"; +import AdminHomePage from "pages/admin/admin-home-page"; + +import NotFound from "pages/not-found"; + +import bootstrapApi from "remotes/bootstrapApi"; + const Router = createBrowserRouter([ { path: `/`, element: , loader: async () => { - const bootstrap = await bootstrapApi({}); + const bootstrap = await bootstrapApi(); return { bootstrap, } @@ -34,9 +39,6 @@ const Router = createBrowserRouter([ path: `cluster/:clusterId`, element: , loader: async ({params}) => { - //const checkData = await bootstrapApi(); - console.log("cluster : ", params) - return {} }, children: [ @@ -44,16 +46,12 @@ const Router = createBrowserRouter([ index: true, element: , loader: () => { - //const checkData = await bootstrapApi(); - console.log("cluster") return {} }, }, { path: `query`, element: , loader: () => { - //const checkData = await bootstrapApi(); - console.log("query client") return {} }, @@ -61,39 +59,30 @@ const Router = createBrowserRouter([ path: `keyspace/:keyspaceName`, element: , loader: () => { - //const checkData = await bootstrapApi(); - console.log("keyspace client") return {} }, }, { path: `keyspace/:keyspaceName/query`, element: , loader: () => { - //const checkData = await bootstrapApi(); - console.log("keyspace query client") return {} }, }, { path: `keyspace/:keyspaceName/table/:tableName`, element: , loader: () => { - //const checkData = await bootstrapApi(); - console.log("keyspace client") return {} }, }, { path: `keyspace/:keyspaceName/compaction`, element: , loader: () => { - //const checkData = await bootstrapApi(); - console.log("keyspace client") return {} }, }, { path: `monitoring`, element: , loader: () => { - //const checkData = await bootstrapApi(); return { } }, @@ -101,7 +90,6 @@ const Router = createBrowserRouter([ path: `monitoring/nodes`, element: , loader: () => { - //const checkData = await bootstrapApi(); return { } }, @@ -109,7 +97,6 @@ const Router = createBrowserRouter([ path: `monitoring/client`, element: , loader: () => { - //const checkData = await bootstrapApi(); return { } } @@ -117,7 +104,6 @@ const Router = createBrowserRouter([ path: `monitoring/metrics`, element: , loader: () => { - //const checkData = await bootstrapApi(); return { } }, @@ -127,7 +113,6 @@ const Router = createBrowserRouter([ path: `admin`, element: , loader: () => { - console.log("admin") return {} }, children: [ From 31cc6d1019a464f9dd6b0434f8fd05baf8ce795e Mon Sep 17 00:00:00 2001 From: akageun Date: Tue, 30 Jul 2024 18:42:56 +0900 Subject: [PATCH 05/27] Apply API Context (#91) --- .../cassdio/web/config/ApiInterceptor.java | 12 +++++++- .../web/config/context/CassdioContext.java | 25 +++++++++++++++++ .../config/context/CassdioContextHolder.java | 28 +++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 cassdio-web/src/main/java/kr/hakdang/cassdio/web/config/context/CassdioContext.java create mode 100644 cassdio-web/src/main/java/kr/hakdang/cassdio/web/config/context/CassdioContextHolder.java diff --git a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/config/ApiInterceptor.java b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/config/ApiInterceptor.java index 327848cd..663fe05a 100644 --- a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/config/ApiInterceptor.java +++ b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/config/ApiInterceptor.java @@ -2,12 +2,15 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import kr.hakdang.cassdio.web.config.context.CassdioContext; +import kr.hakdang.cassdio.web.config.context.CassdioContextHolder; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.HandlerMapping; import java.util.Map; +import java.util.UUID; /** * ApiInterceptor @@ -22,11 +25,18 @@ public class ApiInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); + + CassdioContextHolder.set( + CassdioContext.builder() + .requestId(UUID.randomUUID().toString()) + .build() + ); + return HandlerInterceptor.super.preHandle(request, response, handler); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - HandlerInterceptor.super.afterCompletion(request, response, handler, ex); + CassdioContextHolder.clear(); } } diff --git a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/config/context/CassdioContext.java b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/config/context/CassdioContext.java new file mode 100644 index 00000000..a33bdcbe --- /dev/null +++ b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/config/context/CassdioContext.java @@ -0,0 +1,25 @@ +package kr.hakdang.cassdio.web.config.context; + +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; + +/** + * CassdioContext + * + * @author akageun + * @since 2024-07-29 + */ +@ToString +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class CassdioContext { + private String requestId; //Header + + @Builder + public CassdioContext(String requestId) { + this.requestId = requestId; + } +} diff --git a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/config/context/CassdioContextHolder.java b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/config/context/CassdioContextHolder.java new file mode 100644 index 00000000..473f9429 --- /dev/null +++ b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/config/context/CassdioContextHolder.java @@ -0,0 +1,28 @@ +package kr.hakdang.cassdio.web.config.context; + +import kr.hakdang.cassdio.web.common.dto.response.CassdioConsistencyLevel; + +import java.util.Objects; + +/** + * CassdioContextHolder + * + * @author akageun + * @since 2024-07-29 + */ +public class CassdioContextHolder { + + private static final ThreadLocal DATA = new ThreadLocal<>(); + + public static void set(CassdioContext context) { + DATA.set(context); + } + + public static CassdioContext get() { + return DATA.get(); + } + + public static void clear() { + DATA.remove(); + } +} From c4fccb8f19bd8f48b0a71dbc1a30335b48cde4e4 Mon Sep 17 00:00:00 2001 From: akageun Date: Tue, 30 Jul 2024 20:00:50 +0900 Subject: [PATCH 06/27] Feature/session pool test (#93) * Cql Session Connection Pool Test --- cassdio-core/build.gradle | 7 +- .../domain/cluster/BaseClusterCommander.java | 4 + .../core/domain/cluster/ClusterConnector.java | 22 +---- .../core/domain/cluster/ClusterUtils.java | 8 -- .../cluster/ClusterVersionCommander.java | 29 ++++--- .../domain/cluster/CqlSessionFactory.java | 39 +++++++++ .../client/ClusterClientListCommander.java | 16 +++- .../CompactionHistoryListCommander.java | 7 +- .../keyspace/ClusterKeyspaceCommander.java | 45 ++++++++-- .../keyspace/ClusterKeyspaceProvider.java | 4 +- .../keyspace/table/ClusterTableCommander.java | 12 ++- .../table/ClusterTableGetCommander.java | 4 +- .../table/ClusterTableListCommander.java | 6 +- .../table/ClusterTableRowCommander.java | 4 +- .../column/ClusterTableColumnCommander.java | 8 +- .../udt/ClusterUDTTypeGetCommander.java | 4 +- .../udt/ClusterUDTTypeListCommander.java | 4 +- .../cluster/{ => node}/ClusterNode.java | 2 +- .../{ => node}/ClusterNodeGetCommander.java | 18 +++- .../{ => node}/ClusterNodeListCommander.java | 16 +++- .../cluster/query/ClusterQueryCommander.java | 5 +- .../java/kr/hakdang/cassdio/BaseTest.java | 2 + .../kr/hakdang/cassdio/IntegrationTest.java | 2 + .../cluster/ClusterConnectionManagerTest.java | 10 --- .../cluster/ClusterNodeGetCommanderTest.java | 54 ------------ .../cluster/ClusterNodeListCommanderTest.java | 39 --------- .../cluster/ClusterVersionCommanderTest.java | 10 ++- .../ClusterClientListCommanderTest.java | 12 +-- .../ClusterKeyspaceCommanderTest.java | 62 ++++++++------ .../table/ClusterTableGetCommanderTest.java | 34 ++++---- .../table/ClusterTableListCommanderTest.java | 19 ++++- .../udt/ClusterUDTTypeGetCommanderTest.java | 19 ++++- .../udt/ClusterUDTTypeListCommanderTest.java | 14 +++- .../node/ClusterNodeGetCommanderTest.java | 63 ++++++++++++++ .../node/ClusterNodeListCommanderTest.java | 45 ++++++++++ .../query/ClusterQueryCommanderTest.java | 37 ++++---- .../web/route/cluster/ClusterNodeApi.java | 24 ++---- .../cluster/client/ClusterClientApi.java | 13 +-- .../compaction/CompactionMonitoringApi.java | 15 ++-- .../cluster/keyspace/ClusterKeyspaceApi.java | 63 ++++++-------- .../keyspace/table/ClusterTableApi.java | 84 +++++++------------ .../keyspace/table/ClusterTableProvider.java | 23 ----- .../keyspace/udt/ClusterUDTTypeReader.java | 30 +++---- .../route/cluster/query/ClusterQueryApi.java | 29 +++---- .../cluster/query/ClusterQueryRequest.java | 6 +- 45 files changed, 535 insertions(+), 438 deletions(-) create mode 100644 cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/CqlSessionFactory.java rename cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/{ => node}/ClusterNode.java (96%) rename cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/{ => node}/ClusterNodeGetCommander.java (56%) rename cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/{ => node}/ClusterNodeListCommander.java (54%) delete mode 100644 cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterConnectionManagerTest.java delete mode 100644 cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeGetCommanderTest.java delete mode 100644 cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeListCommanderTest.java create mode 100644 cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeGetCommanderTest.java create mode 100644 cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeListCommanderTest.java delete mode 100644 cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/table/ClusterTableProvider.java diff --git a/cassdio-core/build.gradle b/cassdio-core/build.gradle index 53babaa9..d74798f6 100644 --- a/cassdio-core/build.gradle +++ b/cassdio-core/build.gradle @@ -2,10 +2,9 @@ dependencies { // Spring Boot implementation("org.springframework.boot:spring-boot-starter") implementation("org.mapdb:mapdb:3.1.0") - //TODO ClusterFactory 만들어지면 변경 - api("com.datastax.oss:java-driver-core:${datastaxJavaDriverVersion}") - api("com.datastax.oss:java-driver-query-builder:${datastaxJavaDriverVersion}") - api("com.datastax.oss:java-driver-mapper-runtime:${datastaxJavaDriverVersion}") + implementation("com.datastax.oss:java-driver-core:${datastaxJavaDriverVersion}") + implementation("com.datastax.oss:java-driver-query-builder:${datastaxJavaDriverVersion}") + implementation("com.datastax.oss:java-driver-mapper-runtime:${datastaxJavaDriverVersion}") // implementation("com.datastax.oss:java-driver-core:${datastaxJavaDriverVersion}") // implementation("com.datastax.oss:java-driver-query-builder:${datastaxJavaDriverVersion}") // implementation("com.datastax.oss:java-driver-mapper-runtime:${datastaxJavaDriverVersion}") diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/BaseClusterCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/BaseClusterCommander.java index 33704551..f75b2577 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/BaseClusterCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/BaseClusterCommander.java @@ -13,6 +13,7 @@ import com.datastax.oss.driver.internal.core.util.Strings; import kr.hakdang.cassdio.common.utils.Jsons; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import java.util.HashMap; import java.util.List; @@ -28,6 +29,9 @@ @Slf4j public abstract class BaseClusterCommander { + @Autowired + protected CqlSessionFactory cqlSessionFactory; + protected List> convertRows(CqlSession session, ResultSet resultSet) { ColumnDefinitions definitions = resultSet.getColumnDefinitions(); CodecRegistry codecRegistry = session.getContext().getCodecRegistry(); diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterConnector.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterConnector.java index f7a91db6..5734aea5 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterConnector.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterConnector.java @@ -7,7 +7,6 @@ import kr.hakdang.cassdio.core.domain.cluster.info.ClusterInfo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.builder.ToStringBuilder; import org.springframework.stereotype.Service; import java.net.InetSocketAddress; @@ -45,10 +44,6 @@ public List makeContactPoint(String contactPoints, int port) } public CqlSession makeSession(ClusterConnection clusterConnection) { - return makeSession(clusterConnection, null); - } - - public CqlSession makeSession(ClusterConnection clusterConnection, String keyspace) { CqlSessionBuilder builder = CqlSession.builder() .addContactPoints(makeContactPoint(clusterConnection.getContactPoints(), clusterConnection.getPort())) .withLocalDatacenter(clusterConnection.getLocalDatacenter()); @@ -56,17 +51,16 @@ public CqlSession makeSession(ClusterConnection clusterConnection, String keyspa if (clusterConnection.isAuthCredentials()) { builder.withAuthCredentials(clusterConnection.getUsername(), clusterConnection.getPassword()); } - builder.withConfigLoader( DriverConfigLoader.programmaticBuilder() +// .withDuration(DefaultDriverOption.HEARTBEAT_INTERVAL, Duration.ofSeconds(30)) +// .withDuration(DefaultDriverOption.HEARTBEAT_TIMEOUT, Duration.ofSeconds(60)) + //.withInt(DefaultDriverOption.SESSION_LEAK_THRESHOLD, 0) //For Test .withDuration(DefaultDriverOption.CONNECTION_INIT_QUERY_TIMEOUT, Duration.ofSeconds(5)) .withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofSeconds(5)) .build() ); - if (StringUtils.isNotBlank(keyspace)) { - builder.withKeyspace(keyspace); - } return builder.build(); } @@ -75,14 +69,6 @@ public CqlSession makeSession(String clusterId) { if (info == null) { throw new IllegalArgumentException(String.format("failed to load Cluster(%s)", clusterId)); } - return makeSession(info.makeClusterConnector(), null); - } - - public CqlSession makeSession(String clusterId, String keyspace) { - ClusterInfo info = clusterProvider.findById(clusterId); - if (info == null) { - throw new IllegalArgumentException(String.format("failed to load Cluster(%s)", clusterId)); - } - return makeSession(info.makeClusterConnector(), keyspace); + return makeSession(info.makeClusterConnector()); } } diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterUtils.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterUtils.java index 76f7882d..2b1d2c11 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterUtils.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterUtils.java @@ -23,14 +23,6 @@ */ public abstract class ClusterUtils { - public static Version cassandraVersion(CqlSession session) { - DriverChannel channel = ((InternalDriverContext) session.getContext()).getControlConnection().channel(); - Node node = session.getMetadata().findNode(channel.getEndPoint()) - .orElseThrow();//TODO : node not found exception 처리 - - return node.getCassandraVersion(); - } - public static KeyspaceFilter makeKeyspaceFilter(DriverContext context) { return KeyspaceFilter.newInstance(context.getSessionName(), context.getConfig() .getDefaultProfile() diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterVersionCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterVersionCommander.java index 45c6ffa5..e312d85a 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterVersionCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterVersionCommander.java @@ -5,9 +5,13 @@ import com.datastax.oss.driver.api.core.cql.ResultSet; import com.datastax.oss.driver.api.core.cql.Row; import com.datastax.oss.driver.api.core.cql.SimpleStatement; +import com.datastax.oss.driver.api.core.metadata.Node; import com.datastax.oss.driver.api.querybuilder.QueryBuilder; +import com.datastax.oss.driver.internal.core.channel.DriverChannel; +import com.datastax.oss.driver.internal.core.context.InternalDriverContext; import kr.hakdang.cassdio.core.domain.cluster.keyspace.CassandraSystemKeyspace; import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.CassandraSystemTable; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -19,19 +23,22 @@ @Service public class ClusterVersionCommander extends BaseClusterCommander { - public Version getCassandraVersion(CqlSession session) { - SimpleStatement statement = QueryBuilder - .selectFrom(CassandraSystemKeyspace.SYSTEM.getKeyspaceName(), CassandraSystemTable.SYSTEM_LOCAL.getTableName()) - .all() - .build(); + private final CqlSessionFactory cqlSessionFactory; - ResultSet rs = session.execute(statement); - Row row = rs.one(); - if (row == null) { - throw new RuntimeException("Can't read release version in system_local"); - } + public ClusterVersionCommander( + CqlSessionFactory cqlSessionFactory + ) { + this.cqlSessionFactory = cqlSessionFactory; + } + + public Version getCassandraVersion(String clusterId) { + CqlSession session = cqlSessionFactory.get(clusterId); + + DriverChannel channel = ((InternalDriverContext) session.getContext()).getControlConnection().channel(); + Node node = session.getMetadata().findNode(channel.getEndPoint()) + .orElseThrow();//TODO : node not found exception 처리 - return Version.parse(row.getString("release_version")); + return node.getCassandraVersion(); } } diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/CqlSessionFactory.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/CqlSessionFactory.java new file mode 100644 index 00000000..4f848a91 --- /dev/null +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/CqlSessionFactory.java @@ -0,0 +1,39 @@ +package kr.hakdang.cassdio.core.domain.cluster; + +import com.datastax.oss.driver.api.core.CqlSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.concurrent.ConcurrentHashMap; + +/** + * CqlSessionFactory + * + * @author akageun + * @since 2024-07-30 + */ +@Slf4j +@Service +public class CqlSessionFactory { + + private final ClusterConnector clusterConnector; + + public static ConcurrentHashMap SESSION = new ConcurrentHashMap<>(); + + public CqlSessionFactory(ClusterConnector clusterConnector) { + this.clusterConnector = clusterConnector; + } + + + public CqlSession get(String clusterId) { + String key = String.format("%s", clusterId); + CqlSession session = SESSION.get(key); + if (session == null) { + session = clusterConnector.makeSession(clusterId); + SESSION.put(key, session); + } + + return session; + } +} diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/client/ClusterClientListCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/client/ClusterClientListCommander.java index a9b537fb..5ad12948 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/client/ClusterClientListCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/client/ClusterClientListCommander.java @@ -8,8 +8,10 @@ import kr.hakdang.cassdio.common.error.NotSupportedCassandraVersionException; import kr.hakdang.cassdio.core.domain.cluster.BaseClusterCommander; import kr.hakdang.cassdio.core.domain.cluster.ClusterVersionCommander; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; import kr.hakdang.cassdio.core.domain.cluster.keyspace.CassandraSystemKeyspace; import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.CassandraSystemTable; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @@ -25,14 +27,22 @@ @Service public class ClusterClientListCommander extends BaseClusterCommander { + private final CqlSessionFactory cqlSessionFactory; + private final ClusterVersionCommander clusterVersionCommander; - public ClusterClientListCommander(ClusterVersionCommander clusterVersionCommander) { + public ClusterClientListCommander( + ClusterVersionCommander clusterVersionCommander, + CqlSessionFactory cqlSessionFactory + ) { this.clusterVersionCommander = clusterVersionCommander; + this.cqlSessionFactory = cqlSessionFactory; } - public ClusterClientListResult getClients(CqlSession session) { - Version version = clusterVersionCommander.getCassandraVersion(session); + public ClusterClientListResult getClients(String clusterId) { + CqlSession session = cqlSessionFactory.get(clusterId); + + Version version = clusterVersionCommander.getCassandraVersion(clusterId); if (version.compareTo(Version.V4_0_0) < 0) { throw new NotSupportedCassandraVersionException("It is available in Cassandra version 4.0 and later"); } diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/compaction/CompactionHistoryListCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/compaction/CompactionHistoryListCommander.java index 5c449ca2..15fe20db 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/compaction/CompactionHistoryListCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/compaction/CompactionHistoryListCommander.java @@ -24,11 +24,14 @@ @Service public class CompactionHistoryListCommander extends BaseClusterCommander { - public CompactionHistoryListResult getCompactionHistories(CqlSession session, String keyspace) { + public CompactionHistoryListResult getCompactionHistories(String clusterId, String keyspace) { + CqlSession session = cqlSessionFactory.get(clusterId); + SimpleStatement statement = QueryBuilder .selectFrom(CassandraSystemKeyspace.SYSTEM.getKeyspaceName(), CassandraSystemTable.SYSTEM_COMPACTION_HISTORY.getTableName()) .all() - .build(); + .build() + .setKeyspace(keyspace); ResultSet rs = session.execute(statement); diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/ClusterKeyspaceCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/ClusterKeyspaceCommander.java index bcbd9e6a..0ccf3e5d 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/ClusterKeyspaceCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/ClusterKeyspaceCommander.java @@ -15,9 +15,11 @@ import com.datastax.oss.driver.internal.core.metadata.schema.queries.KeyspaceFilter; import kr.hakdang.cassdio.core.domain.cluster.BaseClusterCommander; import kr.hakdang.cassdio.core.domain.cluster.ClusterUtils; +import kr.hakdang.cassdio.core.domain.cluster.ClusterVersionCommander; import kr.hakdang.cassdio.core.domain.cluster.CqlSessionSelectResult; import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.CassandraSystemTable; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.Duration; @@ -39,14 +41,24 @@ @Service public class ClusterKeyspaceCommander extends BaseClusterCommander { + private final ClusterVersionCommander clusterVersionCommander; + + public ClusterKeyspaceCommander( + ClusterVersionCommander clusterVersionCommander + ) { + this.clusterVersionCommander = clusterVersionCommander; + } + /** * All Keyspace name * - system * - * @param session + * @param clusterId * @return */ - public List allKeyspaceNameList(CqlSession session) { + public List allKeyspaceNameList(String clusterId) { + CqlSession session = cqlSessionFactory.get(clusterId); + List result = new ArrayList<>(); SimpleStatement generalSimpleStatement = makeKeyspaceListSelect(false); @@ -61,7 +73,7 @@ public List allKeyspaceNameList(CqlSession sessi result.add(KeyspaceDTO.KeyspaceNameResult.make(tempRow, keyspaceFilter)); } - if (ClusterUtils.cassandraVersion(session).compareTo(Version.V4_0_0) >= 0) { + if (clusterVersionCommander.getCassandraVersion(clusterId).compareTo(Version.V4_0_0) >= 0) { SimpleStatement virtualSimpleStatement = makeKeyspaceListSelect(true); ResultSet resultSet2 = session.execute(virtualSimpleStatement); @@ -99,7 +111,9 @@ private SimpleStatement makeKeyspaceListSelect(boolean virtual) { .setTimeout(Duration.ofSeconds(3)); } - public KeyspaceDTO.ClusterKeyspaceListResult generalKeyspaceList(CqlSession session) { + public KeyspaceDTO.ClusterKeyspaceListResult generalKeyspaceList(String clusterId) { + CqlSession session = cqlSessionFactory.get(clusterId); + List keyspaceList = new ArrayList<>(); for (Map.Entry entry : session.getMetadata().getKeyspaces().entrySet()) { String keyspaceName = entry.getKey().asCql(true); @@ -120,7 +134,9 @@ public KeyspaceDTO.ClusterKeyspaceListResult generalKeyspaceList(CqlSession sess .build(); } - public String describe(CqlSession session, KeyspaceDTO.ClusterKeyspaceDescribeArgs args) { + public String describe(String clusterId, KeyspaceDTO.ClusterKeyspaceDescribeArgs args) { + CqlSession session = cqlSessionFactory.get(clusterId); + if (ClusterUtils.isSystemKeyspace(session.getContext(), args.getKeyspace())) { //System 테이블은 제공 안함. return ""; } @@ -136,7 +152,9 @@ public String describe(CqlSession session, KeyspaceDTO.ClusterKeyspaceDescribeAr } } - public CqlSessionSelectResult keyspaceDetail(CqlSession session, String keyspace) { + public CqlSessionSelectResult keyspaceDetail(String clusterId, String keyspace) { + CqlSession session = cqlSessionFactory.get(clusterId); + if (ClusterUtils.isVirtualKeyspace(session.getContext(), keyspace)) { //system table 에 keyspace 만 존재함 return CqlSessionSelectResult.empty(); } @@ -165,8 +183,19 @@ public CqlSessionSelectResult keyspaceDetail(CqlSession session, String keyspace .build(); } - public void keyspaceDrop(CqlSession session, String keyspace) { - ResultSet resultSet = session.execute(SchemaBuilder.dropKeyspace(keyspace).build()); + public void keyspaceDrop(String clusterId, String keyspace) { + CqlSession session = cqlSessionFactory.get(clusterId); + //TODO : keyspace validation + if (ClusterUtils.isSystemKeyspace(session.getContext(), keyspace)) { + throw new IllegalArgumentException("System Keyspace!"); + } + + ResultSet resultSet = session.execute( + SchemaBuilder + .dropKeyspace(keyspace) + .build() + .setKeyspace(keyspace) + ); log.info("Keyspace Drop Result - keyspace: {}, ok: {}", keyspace, resultSet.wasApplied()); } } diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/ClusterKeyspaceProvider.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/ClusterKeyspaceProvider.java index d0567441..e0f4f498 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/ClusterKeyspaceProvider.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/ClusterKeyspaceProvider.java @@ -27,8 +27,8 @@ public ClusterKeyspaceProvider(ClusterKeyspaceCommander clusterKeyspaceCommander } @Cacheable(cacheNames = CacheType.CacheTypeNames.CLUSTER_KEYSPACE_NAME_LIST, key = "#clusterId") - public List keyspaceNameResultList(CqlSession session, String clusterId) { - return clusterKeyspaceCommander.allKeyspaceNameList(session); + public List keyspaceNameResultList(String clusterId) { + return clusterKeyspaceCommander.allKeyspaceNameList(clusterId); } @CacheEvict(cacheNames = CacheType.CacheTypeNames.CLUSTER_KEYSPACE_NAME_LIST, key = "#clusterId") diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableCommander.java index 27abe90a..fed374fb 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableCommander.java @@ -24,7 +24,9 @@ @Service public class ClusterTableCommander extends BaseClusterCommander { - public String tableDescribe(CqlSession session, String keyspace, String table) { + public String tableDescribe(String clusterId, String keyspace, String table) { + CqlSession session = cqlSessionFactory.get(clusterId); + if (ClusterUtils.isSystemKeyspace(session.getContext(), keyspace)) { return ""; } @@ -43,12 +45,16 @@ public String tableDescribe(CqlSession session, String keyspace, String table) { } } - public void tableDrop(CqlSession session, String keyspace, String table) { + public void tableDrop(String clusterId, String keyspace, String table) { + CqlSession session = cqlSessionFactory.get(clusterId); + ResultSet resultSet = session.execute(SchemaBuilder.dropTable(keyspace, table).build()); log.info("Table Drop Result - keyspace: {}, table: {}, ok: {}", keyspace, table, resultSet.wasApplied()); } - public void tableTruncate(CqlSession session, String keyspace, String table) { + public void tableTruncate(String clusterId, String keyspace, String table) { + CqlSession session = cqlSessionFactory.get(clusterId); + ResultSet resultSet = session.execute(QueryBuilder.truncate(keyspace, table).build()); log.info("Table Truncate Result - keyspace: {}, table: {}, ok: {}", keyspace, table, resultSet.wasApplied()); } diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableGetCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableGetCommander.java index 4026ecc0..64a29b83 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableGetCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableGetCommander.java @@ -25,7 +25,9 @@ @Service public class ClusterTableGetCommander extends BaseClusterCommander { - public CqlSessionSelectResult tableDetail(CqlSession session, TableDTO.ClusterTableGetArgs args) { + public CqlSessionSelectResult tableDetail(String clusterId, TableDTO.ClusterTableGetArgs args) { + CqlSession session = cqlSessionFactory.get(clusterId); + int limit = 1; SimpleStatement statement = ClusterUtils.getSchemaTables(session, args.getKeyspace()) .all() diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableListCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableListCommander.java index c09ede51..3c257eaa 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableListCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableListCommander.java @@ -32,11 +32,13 @@ public class ClusterTableListCommander extends BaseClusterCommander { * Simple Table List * - system 테이블에 대해서도 테이블명에 대해 조회 가능 * - * @param session + * @param clusterId * @param args * @return */ - public CqlSessionSelectResults tableList(CqlSession session, TableDTO.ClusterTableListArgs args) { + public CqlSessionSelectResults tableList(String clusterId, TableDTO.ClusterTableListArgs args) { + CqlSession session = cqlSessionFactory.get(clusterId); + SimpleStatement statement = ClusterUtils.getSchemaTables(session, args.getKeyspace()) .all() .whereColumn(CassandraSystemTablesColumn.TABLES_KEYSPACE_NAME.getColumnName()).isEqualTo(bindMarker()) diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableRowCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableRowCommander.java index 8537b31e..f719e816 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableRowCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableRowCommander.java @@ -24,7 +24,9 @@ @Service public class ClusterTableRowCommander extends BaseClusterCommander { - public CqlSessionSelectResults rowSelect(CqlSession session, TableDTO.ClusterTableRowArgs args) { + public CqlSessionSelectResults rowSelect(String clusterId, TableDTO.ClusterTableRowArgs args) { + CqlSession session = cqlSessionFactory.get(clusterId); + SimpleStatement statement = QueryBuilder.selectFrom(args.getKeyspace(), args.getTable()) .all() .build() diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/column/ClusterTableColumnCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/column/ClusterTableColumnCommander.java index e0ab565b..86f3dab2 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/column/ClusterTableColumnCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/column/ClusterTableColumnCommander.java @@ -32,11 +32,13 @@ @Service public class ClusterTableColumnCommander extends BaseClusterCommander { - public CqlSessionSelectResults columnList(CqlSession session, String keyspace, String table) { - return columnList(session, keyspace, table, emptyList()); + public CqlSessionSelectResults columnList(String clusterId, String keyspace, String table) { + return columnList(clusterId, keyspace, table, emptyList()); } - public CqlSessionSelectResults columnList(CqlSession session, String keyspace, String table, List columnList) { + public CqlSessionSelectResults columnList(String clusterId, String keyspace, String table, List columnList) { + CqlSession session = cqlSessionFactory.get(clusterId); + SimpleStatement statement; Select select = getColumnTable(session, keyspace) diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeGetCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeGetCommander.java index fcbd829f..73561612 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeGetCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeGetCommander.java @@ -26,7 +26,9 @@ @Service public class ClusterUDTTypeGetCommander extends BaseClusterCommander { - public ClusterUDTType getType(CqlSession session, ClusterUDTTypeGetArgs args) { + public ClusterUDTType getType(String clusterId, ClusterUDTTypeGetArgs args) { + CqlSession session = cqlSessionFactory.get(clusterId); + SimpleStatement statement = QueryBuilder .selectFrom(SYSTEM_SCHEMA.getKeyspaceName(), SYSTEM_SCHEMA_TYPES.getTableName()) .all() diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeListCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeListCommander.java index 111f4738..8c25ef0b 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeListCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeListCommander.java @@ -28,7 +28,9 @@ @Service public class ClusterUDTTypeListCommander extends BaseClusterCommander { - public ClusterUDTTypeListResult listTypes(CqlSession session, ClusterUDTTypeListArgs args) { + public ClusterUDTTypeListResult listTypes(String clusterId, ClusterUDTTypeListArgs args) { + CqlSession session = cqlSessionFactory.get(clusterId); + SimpleStatement statement = QueryBuilder .selectFrom(SYSTEM_SCHEMA.getKeyspaceName(), SYSTEM_SCHEMA_TYPES.getTableName()) .all() diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNode.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNode.java similarity index 96% rename from cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNode.java rename to cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNode.java index 9103e9be..201ec07e 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNode.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNode.java @@ -1,4 +1,4 @@ -package kr.hakdang.cassdio.core.domain.cluster; +package kr.hakdang.cassdio.core.domain.cluster.node; import com.datastax.oss.driver.api.core.metadata.Node; import com.datastax.oss.driver.api.core.metadata.NodeState; diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeGetCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeGetCommander.java similarity index 56% rename from cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeGetCommander.java rename to cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeGetCommander.java index 4de79f3b..9dda514b 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeGetCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeGetCommander.java @@ -1,15 +1,17 @@ -package kr.hakdang.cassdio.core.domain.cluster; +package kr.hakdang.cassdio.core.domain.cluster.node; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.metadata.Node; +import kr.hakdang.cassdio.core.domain.cluster.BaseClusterCommander; import kr.hakdang.cassdio.core.domain.cluster.ClusterException.ClusterNodeNotFoundException; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; import org.springframework.stereotype.Service; import java.util.Map; import java.util.UUID; /** - * ClusterNodeListCommander + * ClusterNodeGetCommander * * @author seungh0 * @since 2024-07-03 @@ -17,7 +19,17 @@ @Service public class ClusterNodeGetCommander extends BaseClusterCommander { - public ClusterNode getNode(CqlSession session, UUID nodeId) { + private final CqlSessionFactory cqlSessionFactory; + + public ClusterNodeGetCommander( + CqlSessionFactory cqlSessionFactory + ) { + this.cqlSessionFactory = cqlSessionFactory; + } + + public ClusterNode getNode(String clusterId, UUID nodeId) { + CqlSession session = cqlSessionFactory.get(clusterId); + Map nodes = session.getMetadata().getNodes(); Node node = nodes.get(nodeId); diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeListCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeListCommander.java similarity index 54% rename from cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeListCommander.java rename to cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeListCommander.java index dd64b7b9..4d088c97 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeListCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeListCommander.java @@ -1,6 +1,8 @@ -package kr.hakdang.cassdio.core.domain.cluster; +package kr.hakdang.cassdio.core.domain.cluster.node; import com.datastax.oss.driver.api.core.CqlSession; +import kr.hakdang.cassdio.core.domain.cluster.BaseClusterCommander; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; import org.springframework.stereotype.Service; import java.util.Comparator; @@ -16,7 +18,17 @@ @Service public class ClusterNodeListCommander extends BaseClusterCommander { - public List listNodes(CqlSession session) { + private final CqlSessionFactory cqlSessionFactory; + + public ClusterNodeListCommander( + CqlSessionFactory cqlSessionFactory + ) { + this.cqlSessionFactory = cqlSessionFactory; + } + + public List listNodes(String clusterId) { + CqlSession session = cqlSessionFactory.get(clusterId); + return session.getMetadata().getNodes().values().stream() .map(ClusterNode::from) .sorted(Comparator.comparing(ClusterNode::getDatacenter) diff --git a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommander.java b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommander.java index e0ef46a0..2b9c7e04 100644 --- a/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommander.java +++ b/cassdio-core/src/main/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommander.java @@ -15,6 +15,7 @@ import kr.hakdang.cassdio.core.domain.cluster.ClusterUtils; import kr.hakdang.cassdio.core.domain.cluster.keyspace.CassdioColumnDefinition; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.nio.ByteBuffer; @@ -35,9 +36,11 @@ public class ClusterQueryCommander extends BaseClusterCommander { public QueryDTO.ClusterQueryCommanderResult execute( - CqlSession session, + String clusterId, QueryDTO.ClusterQueryCommanderArgs args ) { + CqlSession session = cqlSessionFactory.get(clusterId); + SimpleStatementBuilder simpleBuilder = SimpleStatement.builder(args.getQuery()) .setPageSize(args.getPageSize()) // 10 per pages .setTimeout(Duration.ofSeconds(args.getTimeoutSeconds())) // 3s timeout diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/BaseTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/BaseTest.java index 8b47f225..fe33636b 100644 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/BaseTest.java +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/BaseTest.java @@ -15,4 +15,6 @@ @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) @ExtendWith(SpringExtension.class) public abstract class BaseTest { + + protected final static String CLUSTER_ID = "12345"; } diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/IntegrationTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/IntegrationTest.java index 5e7a5b0f..7be49002 100644 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/IntegrationTest.java +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/IntegrationTest.java @@ -1,9 +1,11 @@ package kr.hakdang.cassdio; import com.datastax.oss.driver.api.core.CqlSession; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; import org.junit.jupiter.api.Tag; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import java.net.InetSocketAddress; diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterConnectionManagerTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterConnectionManagerTest.java deleted file mode 100644 index e555c4e0..00000000 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterConnectionManagerTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package kr.hakdang.cassdio.core.domain.cluster; - -import kr.hakdang.cassdio.IntegrationTest; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; - -@Slf4j -class ClusterConnectionManagerTest extends IntegrationTest { - -} diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeGetCommanderTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeGetCommanderTest.java deleted file mode 100644 index a5d4003a..00000000 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeGetCommanderTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package kr.hakdang.cassdio.core.domain.cluster; - -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.metadata.Node; -import kr.hakdang.cassdio.IntegrationTest; -import kr.hakdang.cassdio.core.domain.cluster.ClusterException.ClusterNodeNotFoundException; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Map; -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -/** - * ClusterNodeGetCommanderTest - * - * @author seungh0 - * @since 2024-07-03 - */ -class ClusterNodeGetCommanderTest extends IntegrationTest { - - @Autowired - private ClusterNodeGetCommander clusterNodeGetCommander; - - @Test - void not_exists_node_in_cluster() { - // when & then - assertThatThrownBy(() -> clusterNodeGetCommander.getNode(makeSession(), UUID.randomUUID())) - .isInstanceOf(ClusterNodeNotFoundException.class); - } - - @Test - void get_node_in_cluster() { - // given - try (CqlSession session = makeSession()) { - - Map nodes = session.getMetadata().getNodes(); - - for (Map.Entry node : nodes.entrySet()) { - ClusterNode sut = clusterNodeGetCommander.getNode(session, node.getKey()); - - assertThat(sut.getNodeId()).isEqualTo(node.getValue().getHostId()); - assertThat(sut.getDatacenter()).isEqualTo("dc1"); - assertThat(sut.getRack()).isEqualTo("rack1"); - assertThat(sut.getUpSinceMillis()).isGreaterThan(0); - assertThat(sut.getCassandraVersion()).isNotNull(); - assertThat(sut.getCassandraVersion()).isEqualTo(String.valueOf(node.getValue().getCassandraVersion())); - } - } - } - -} diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeListCommanderTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeListCommanderTest.java deleted file mode 100644 index 0e48cbb2..00000000 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterNodeListCommanderTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package kr.hakdang.cassdio.core.domain.cluster; - -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.metadata.NodeState; -import kr.hakdang.cassdio.IntegrationTest; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * ClusterNodeListCommanderTest - * - * @author seungh0 - * @since 2024-07-03 - */ -class ClusterNodeListCommanderTest extends IntegrationTest { - - @Autowired - private ClusterNodeListCommander clusterNodeListCommander; - - @Test - void list_nodes_in_cluster() { - // given - try (CqlSession session = makeSession()) { - List nodes = clusterNodeListCommander.listNodes(session); - - assertThat(nodes).hasSize(1); - assertThat(nodes.getFirst().getRack()).isEqualTo("rack1"); - assertThat(nodes.getFirst().getNodeState()).isEqualTo(NodeState.UP); - assertThat(nodes.getFirst().getDatacenter()).isEqualTo("dc1"); - assertThat(nodes.getFirst().getUpSinceMillis()).isGreaterThan(0); - assertThat(nodes.getFirst().getCassandraVersion()).isNotNull(); - } - } - -} diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterVersionCommanderTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterVersionCommanderTest.java index 06c1c4bf..74fd5107 100644 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterVersionCommanderTest.java +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/ClusterVersionCommanderTest.java @@ -4,8 +4,11 @@ import kr.hakdang.cassdio.IntegrationTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; /** * ClusterVersionCommanderTest @@ -18,10 +21,15 @@ class ClusterVersionCommanderTest extends IntegrationTest { @Autowired private ClusterVersionCommander clusterVersionCommander; + @MockBean + private CqlSessionFactory cqlSessionFactory; + @Test void get_cassandra_version() { + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + // when - Version version = clusterVersionCommander.getCassandraVersion(makeSession()); + Version version = clusterVersionCommander.getCassandraVersion(CLUSTER_ID); // then assertThat(version).isNotNull(); diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/client/ClusterClientListCommanderTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/client/ClusterClientListCommanderTest.java index 39a06545..e95a6577 100644 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/client/ClusterClientListCommanderTest.java +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/client/ClusterClientListCommanderTest.java @@ -5,9 +5,11 @@ import kr.hakdang.cassdio.BaseTest; import kr.hakdang.cassdio.common.error.NotSupportedCassandraVersionException; import kr.hakdang.cassdio.core.domain.cluster.ClusterVersionCommander; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; +import org.springframework.boot.test.mock.mockito.MockBean; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; @@ -21,17 +23,17 @@ */ class ClusterClientListCommanderTest extends BaseTest { - @Mock - private CqlSession session; - @Mock private ClusterVersionCommander clusterVersionCommander; + @MockBean + private CqlSessionFactory cqlSessionFactory; + private ClusterClientListCommander clusterClientListCommander; @BeforeEach void setUp() { - clusterClientListCommander = new ClusterClientListCommander(clusterVersionCommander); + clusterClientListCommander = new ClusterClientListCommander(clusterVersionCommander, cqlSessionFactory); } @Test @@ -39,7 +41,7 @@ void not_supported_under_v4_0_0() { // given when(clusterVersionCommander.getCassandraVersion(any())).thenReturn(Version.V3_0_0); - assertThatThrownBy(() -> clusterClientListCommander.getClients(session)) + assertThatThrownBy(() -> clusterClientListCommander.getClients(CLUSTER_ID)) .isInstanceOf(NotSupportedCassandraVersionException.class); } diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/ClusterKeyspaceCommanderTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/ClusterKeyspaceCommanderTest.java index b9a8095d..440b133d 100644 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/ClusterKeyspaceCommanderTest.java +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/ClusterKeyspaceCommanderTest.java @@ -4,42 +4,53 @@ import com.datastax.oss.driver.api.core.Version; import kr.hakdang.cassdio.IntegrationTest; import kr.hakdang.cassdio.core.domain.cluster.ClusterUtils; +import kr.hakdang.cassdio.core.domain.cluster.ClusterVersionCommander; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; import java.util.List; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; + @Slf4j class ClusterKeyspaceCommanderTest extends IntegrationTest { @Autowired private ClusterKeyspaceCommander clusterKeyspaceCommander; + @Autowired + private ClusterVersionCommander clusterVersionCommander; + + @MockBean + private CqlSessionFactory cqlSessionFactory; + @Test void allSystemKeyspaceList() { - try (CqlSession session = makeSession()) { + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); - //system keyspace 체크 - List keyspaceNameList = clusterKeyspaceCommander.allKeyspaceNameList(session).stream() - .filter(KeyspaceDTO.KeyspaceNameResult::isSystemKeyspace) - .map(KeyspaceDTO.KeyspaceNameResult::getKeyspaceName).toList(); + //system keyspace 체크 + List keyspaceNameList = clusterKeyspaceCommander.allKeyspaceNameList(CLUSTER_ID).stream() + .filter(KeyspaceDTO.KeyspaceNameResult::isSystemKeyspace) + .map(KeyspaceDTO.KeyspaceNameResult::getKeyspaceName).toList(); - int expectedSize = CassandraSystemKeyspace.onlySystemKeyspaceList().size(); - for (CassandraSystemKeyspace systemKeyspace : CassandraSystemKeyspace.onlySystemKeyspaceList()) { - Assertions.assertTrue(keyspaceNameList.contains(systemKeyspace.getKeyspaceName()), "Default System Table Empty!!!"); - } + int expectedSize = CassandraSystemKeyspace.onlySystemKeyspaceList().size(); + for (CassandraSystemKeyspace systemKeyspace : CassandraSystemKeyspace.onlySystemKeyspaceList()) { + Assertions.assertTrue(keyspaceNameList.contains(systemKeyspace.getKeyspaceName()), "Default System Table Empty!!!"); + } - if (ClusterUtils.cassandraVersion(session).compareTo(Version.V4_0_0) >= 0) { - expectedSize += CassandraSystemKeyspace.virtualSystemKeyspaceList().size(); - for (CassandraSystemKeyspace virtualKeyspace : CassandraSystemKeyspace.virtualSystemKeyspaceList()) { - Assertions.assertTrue(keyspaceNameList.contains(virtualKeyspace.getKeyspaceName()), "Default Virtual System Table Empty!!!"); - } + if (clusterVersionCommander.getCassandraVersion(CLUSTER_ID).compareTo(Version.V4_0_0) >= 0) { + expectedSize += CassandraSystemKeyspace.virtualSystemKeyspaceList().size(); + for (CassandraSystemKeyspace virtualKeyspace : CassandraSystemKeyspace.virtualSystemKeyspaceList()) { + Assertions.assertTrue(keyspaceNameList.contains(virtualKeyspace.getKeyspaceName()), "Default Virtual System Table Empty!!!"); } - - Assertions.assertEquals(expectedSize, keyspaceNameList.size()); } + + Assertions.assertEquals(expectedSize, keyspaceNameList.size()); } /** @@ -47,17 +58,18 @@ void allSystemKeyspaceList() { */ @Test void generalKeyspaceList() { - try (CqlSession session = makeSession()) { + CqlSession session = makeSession(); - //system keyspace 체크 - KeyspaceDTO.ClusterKeyspaceListResult keyspaceNameList = clusterKeyspaceCommander.generalKeyspaceList(session); + given(cqlSessionFactory.get(anyString())).willReturn(session); - for (KeyspaceResult keyspaceResult : keyspaceNameList.getKeyspaceList()) { - Assertions.assertFalse( - ClusterUtils.isSystemKeyspace(session.getContext(), keyspaceResult.getKeyspaceName()), - "include system table" - ); - } + //system keyspace 체크 + KeyspaceDTO.ClusterKeyspaceListResult keyspaceNameList = clusterKeyspaceCommander.generalKeyspaceList(CLUSTER_ID); + + for (KeyspaceResult keyspaceResult : keyspaceNameList.getKeyspaceList()) { + Assertions.assertFalse( + ClusterUtils.isSystemKeyspace(session.getContext(), keyspaceResult.getKeyspaceName()), + "include system table" + ); } } } diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableGetCommanderTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableGetCommanderTest.java index efc1a3de..e635cb59 100644 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableGetCommanderTest.java +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableGetCommanderTest.java @@ -1,18 +1,20 @@ package kr.hakdang.cassdio.core.domain.cluster.keyspace.table; -import com.datastax.oss.driver.api.core.CqlSession; import kr.hakdang.cassdio.IntegrationTest; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; import kr.hakdang.cassdio.core.domain.cluster.CqlSessionSelectResult; -import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.TableDTO.ClusterTableGetArgs; import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.ClusterTableException.ClusterTableNotFoundException; +import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.TableDTO.ClusterTableGetArgs; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.TestConstructor; +import org.springframework.boot.test.mock.mockito.MockBean; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; /** * ClusterTableGetCommanderTest @@ -25,6 +27,8 @@ class ClusterTableGetCommanderTest extends IntegrationTest { private final ClusterTableCommander clusterTableCommander; + @MockBean + private CqlSessionFactory cqlSessionFactory; @Autowired private ClusterTableGetCommander clusterTableGetCommander; @@ -37,13 +41,15 @@ class ClusterTableGetCommanderTest extends IntegrationTest { @Disabled //TODO 변경필요 void get_table_in_keyspace() { + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + ClusterTableGetArgs args = ClusterTableGetArgs.builder() .keyspace(keyspaceName) .table("test_table_1") .build(); // when - CqlSessionSelectResult sut = clusterTableGetCommander.tableDetail(makeSession(), args); + CqlSessionSelectResult sut = clusterTableGetCommander.tableDetail(CLUSTER_ID, args); // then // assertThat(sut.getTableDescribe()).isNotBlank(); @@ -81,25 +87,25 @@ void get_table_in_keyspace() { @Test void when_get_not_exists_table_throw_not_exists_exception() { - try (CqlSession session = makeSession()) { - // given - TableDTO.ClusterTableGetArgs args = TableDTO.ClusterTableGetArgs.builder() - .keyspace(keyspaceName) - .table("not_exists_table") - .build(); + // given + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + TableDTO.ClusterTableGetArgs args = TableDTO.ClusterTableGetArgs.builder() + .keyspace(keyspaceName) + .table("not_exists_table") + .build(); - // when & then - assertThatThrownBy(() -> clusterTableGetCommander.tableDetail(session, args)).isInstanceOf(ClusterTableNotFoundException.class); - } + // when & then + assertThatThrownBy(() -> clusterTableGetCommander.tableDetail(CLUSTER_ID, args)).isInstanceOf(ClusterTableNotFoundException.class); } @Test void get_system_table_describe() { // given + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); // when - String sut = clusterTableCommander.tableDescribe(makeSession(), "system_schema", "tables"); + String sut = clusterTableCommander.tableDescribe(CLUSTER_ID, "system_schema", "tables"); // then assertThat(sut).isBlank(); diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableListCommanderTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableListCommanderTest.java index 539fbf49..7cb4bf61 100644 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableListCommanderTest.java +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/table/ClusterTableListCommanderTest.java @@ -1,13 +1,17 @@ package kr.hakdang.cassdio.core.domain.cluster.keyspace.table; import kr.hakdang.cassdio.IntegrationTest; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; import kr.hakdang.cassdio.core.domain.cluster.CqlSessionSelectResults; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.TestConstructor; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; /** * ClusterTableListCommanderTest @@ -19,6 +23,9 @@ @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) public class ClusterTableListCommanderTest extends IntegrationTest { + @MockBean + private CqlSessionFactory cqlSessionFactory; + private final ClusterTableListCommander clusterTableListCommander; public ClusterTableListCommanderTest(ClusterTableListCommander clusterTableListCommander) { @@ -28,13 +35,15 @@ public ClusterTableListCommanderTest(ClusterTableListCommander clusterTableListC @Test void list_tables() { // given + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + TableDTO.ClusterTableListArgs args = TableDTO.ClusterTableListArgs.builder() .keyspace(keyspaceName) .pageSize(50) .build(); // when - CqlSessionSelectResults sut = clusterTableListCommander.tableList(makeSession(), args); + CqlSessionSelectResults sut = clusterTableListCommander.tableList(CLUSTER_ID, args); // then assertThat(sut).isNotNull(); @@ -52,13 +61,15 @@ void list_tables() { @Test void listTables_with_limit() { // given + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + TableDTO.ClusterTableListArgs args = TableDTO.ClusterTableListArgs.builder() .keyspace(keyspaceName) .pageSize(1) .build(); // when - CqlSessionSelectResults sut = clusterTableListCommander.tableList(makeSession(), args); + CqlSessionSelectResults sut = clusterTableListCommander.tableList(CLUSTER_ID, args); // then assertThat(sut).isNotNull(); @@ -73,12 +84,14 @@ void listTables_with_limit() { @Test void when_empty_table_in_keyspace_result_empty() { // given + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + TableDTO.ClusterTableListArgs args = TableDTO.ClusterTableListArgs.builder() .keyspace("empty_table_keyspace") .build(); // when - CqlSessionSelectResults sut = clusterTableListCommander.tableList(makeSession(), args); + CqlSessionSelectResults sut = clusterTableListCommander.tableList(CLUSTER_ID, args); // then assertThat(sut).isNotNull(); diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeGetCommanderTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeGetCommanderTest.java index ee6d1136..da571a3b 100644 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeGetCommanderTest.java +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeGetCommanderTest.java @@ -1,13 +1,17 @@ package kr.hakdang.cassdio.core.domain.cluster.keyspace.udt; import kr.hakdang.cassdio.IntegrationTest; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; import kr.hakdang.cassdio.core.domain.cluster.keyspace.udt.ClusterUDTTypeArgs.ClusterUDTTypeGetArgs; import kr.hakdang.cassdio.core.domain.cluster.keyspace.udt.ClusterUDTTypeException.ClusterUDTTypeNotFoundException; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; /** * ClusterUDTTypeGetCommanderTest @@ -20,16 +24,21 @@ class ClusterUDTTypeGetCommanderTest extends IntegrationTest { @Autowired private ClusterUDTTypeGetCommander clusterUDTTypeGetCommander; + @MockBean + private CqlSessionFactory cqlSessionFactory; + @Test void get_udt_type_in_keyspace() { // given + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + ClusterUDTTypeGetArgs args = ClusterUDTTypeGetArgs.builder() .keyspace(keyspaceName) .type("test_type_1") .build(); // when - ClusterUDTType sut = clusterUDTTypeGetCommander.getType(makeSession(), args); + ClusterUDTType sut = clusterUDTTypeGetCommander.getType(CLUSTER_ID, args); // then assertThat(sut.getTypeName()).isEqualTo("test_type_1"); @@ -42,26 +51,30 @@ void get_udt_type_in_keyspace() { @Test void when_get_not_exists_udt_type_in_keyspace_throw_not_exists_exception() { // given + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + ClusterUDTTypeGetArgs args = ClusterUDTTypeGetArgs.builder() .keyspace(keyspaceName) .type("not_exist_type") .build(); // when - assertThatThrownBy(() -> clusterUDTTypeGetCommander.getType(makeSession(), args)) + assertThatThrownBy(() -> clusterUDTTypeGetCommander.getType(CLUSTER_ID, args)) .isInstanceOf(ClusterUDTTypeNotFoundException.class); } @Test void when_get_not_exists_udt_type_in_keyspace_throw_not_exists_exception_2() { // given + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + ClusterUDTTypeGetArgs args = ClusterUDTTypeGetArgs.builder() .keyspace("another_keyspace") .type("test_type_1") .build(); // when & then - assertThatThrownBy(() -> clusterUDTTypeGetCommander.getType(makeSession(), args)) + assertThatThrownBy(() -> clusterUDTTypeGetCommander.getType(CLUSTER_ID, args)) .isInstanceOf(ClusterUDTTypeNotFoundException.class); } diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeListCommanderTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeListCommanderTest.java index 9e0fe0c4..2a839fc8 100644 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeListCommanderTest.java +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/keyspace/udt/ClusterUDTTypeListCommanderTest.java @@ -1,11 +1,15 @@ package kr.hakdang.cassdio.core.domain.cluster.keyspace.udt; import kr.hakdang.cassdio.IntegrationTest; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; import kr.hakdang.cassdio.core.domain.cluster.keyspace.udt.ClusterUDTTypeArgs.ClusterUDTTypeListArgs; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; /** * ClusterUDTTypeListCommanderTest @@ -17,17 +21,21 @@ class ClusterUDTTypeListCommanderTest extends IntegrationTest { @Autowired private ClusterUDTTypeListCommander clusterUDTTypeListCommander; + @MockBean + private CqlSessionFactory cqlSessionFactory; @Test void list_udt_types_in_keyspace() { // given + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + ClusterUDTTypeListArgs args = ClusterUDTTypeListArgs.builder() .keyspace(keyspaceName) .nextPageState(null) .build(); // when - ClusterUDTTypeListResult sut = clusterUDTTypeListCommander.listTypes(makeSession(), args); + ClusterUDTTypeListResult sut = clusterUDTTypeListCommander.listTypes(CLUSTER_ID, args); // then assertThat(sut.getTypes()).hasSize(1); @@ -42,13 +50,15 @@ void list_udt_types_in_keyspace() { @Test void when_empty_type_exist_in_keyspace_return_empty_list() { // given + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + ClusterUDTTypeListArgs args = ClusterUDTTypeListArgs.builder() .keyspace("empty_keyspace") .nextPageState(null) .build(); // when - ClusterUDTTypeListResult sut = clusterUDTTypeListCommander.listTypes(makeSession(), args); + ClusterUDTTypeListResult sut = clusterUDTTypeListCommander.listTypes(CLUSTER_ID, args); // then assertThat(sut.getTypes()).isEmpty(); diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeGetCommanderTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeGetCommanderTest.java new file mode 100644 index 00000000..6739e03f --- /dev/null +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeGetCommanderTest.java @@ -0,0 +1,63 @@ +package kr.hakdang.cassdio.core.domain.cluster.node; + +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.metadata.Node; +import kr.hakdang.cassdio.IntegrationTest; +import kr.hakdang.cassdio.core.domain.cluster.ClusterException.ClusterNodeNotFoundException; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; + +import java.util.Map; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; + +/** + * ClusterNodeGetCommanderTest + * + * @author seungh0 + * @since 2024-07-03 + */ +class ClusterNodeGetCommanderTest extends IntegrationTest { + + @Autowired + private ClusterNodeGetCommander clusterNodeGetCommander; + + @MockBean + private CqlSessionFactory cqlSessionFactory; + + @Test + void not_exists_node_in_cluster() { + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + + // when & then + assertThatThrownBy(() -> clusterNodeGetCommander.getNode(CLUSTER_ID, UUID.randomUUID())) + .isInstanceOf(ClusterNodeNotFoundException.class); + } + + @Test + void get_node_in_cluster() { + // given + CqlSession session = makeSession(); + given(cqlSessionFactory.get(anyString())).willReturn(session); + + Map nodes = session.getMetadata().getNodes(); + + for (Map.Entry node : nodes.entrySet()) { + ClusterNode sut = clusterNodeGetCommander.getNode(CLUSTER_ID, node.getKey()); + + assertThat(sut.getNodeId()).isEqualTo(node.getValue().getHostId()); + assertThat(sut.getDatacenter()).isEqualTo("dc1"); + assertThat(sut.getRack()).isEqualTo("rack1"); + assertThat(sut.getUpSinceMillis()).isGreaterThan(0); + assertThat(sut.getCassandraVersion()).isNotNull(); + assertThat(sut.getCassandraVersion()).isEqualTo(String.valueOf(node.getValue().getCassandraVersion())); + } + } + +} diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeListCommanderTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeListCommanderTest.java new file mode 100644 index 00000000..53b59bae --- /dev/null +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/node/ClusterNodeListCommanderTest.java @@ -0,0 +1,45 @@ +package kr.hakdang.cassdio.core.domain.cluster.node; + +import com.datastax.oss.driver.api.core.metadata.NodeState; +import kr.hakdang.cassdio.IntegrationTest; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; + +/** + * ClusterNodeListCommanderTest + * + * @author seungh0 + * @since 2024-07-03 + */ +class ClusterNodeListCommanderTest extends IntegrationTest { + + @Autowired + private ClusterNodeListCommander clusterNodeListCommander; + + @MockBean + private CqlSessionFactory cqlSessionFactory; + + @Test + void list_nodes_in_cluster() { + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + + // given + List nodes = clusterNodeListCommander.listNodes(CLUSTER_ID); + + assertThat(nodes).hasSize(1); + assertThat(nodes.getFirst().getRack()).isEqualTo("rack1"); + assertThat(nodes.getFirst().getNodeState()).isEqualTo(NodeState.UP); + assertThat(nodes.getFirst().getDatacenter()).isEqualTo("dc1"); + assertThat(nodes.getFirst().getUpSinceMillis()).isGreaterThan(0); + assertThat(nodes.getFirst().getCassandraVersion()).isNotNull(); + } + +} diff --git a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommanderTest.java b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommanderTest.java index 94f0d14f..6be950d7 100644 --- a/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommanderTest.java +++ b/cassdio-core/src/test/java/kr/hakdang/cassdio/core/domain/cluster/query/ClusterQueryCommanderTest.java @@ -2,14 +2,18 @@ import com.datastax.oss.driver.api.core.CqlSession; import kr.hakdang.cassdio.IntegrationTest; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.util.Assert; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; @Slf4j class ClusterQueryCommanderTest extends IntegrationTest { @@ -22,6 +26,9 @@ class ClusterQueryCommanderTest extends IntegrationTest { this.clusterQueryCommander = clusterQueryCommander; } + @MockBean + private CqlSessionFactory cqlSessionFactory; + @Value("${cassdio.test-cassandra.keyspace}") private String keyspaceName; @@ -30,39 +37,37 @@ class ClusterQueryCommanderTest extends IntegrationTest { @Test void queryTest() { //GIVEN + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + QueryDTO.ClusterQueryCommanderArgs args = QueryDTO.ClusterQueryCommanderArgs.builder() .query(String.format("SELECT * FROM %s.%s", keyspaceName, TABLE_NAME)) .build(); - try (CqlSession session = makeSession()) { - - //WHEN - QueryDTO.ClusterQueryCommanderResult result = clusterQueryCommander.execute(session, args); + //WHEN + QueryDTO.ClusterQueryCommanderResult result = clusterQueryCommander.execute(CLUSTER_ID, args); - //THEN - assertThat(result).isNotNull(); - assertThat(result.getRows()).isNotNull(); - } + //THEN + assertThat(result).isNotNull(); + assertThat(result.getRows()).isNotNull(); } @Test void useKeyspaceTest() { //GIVEN + given(cqlSessionFactory.get(anyString())).willReturn(makeSession()); + QueryDTO.ClusterQueryCommanderArgs args = QueryDTO.ClusterQueryCommanderArgs.builder() .query(String.format("SELECT * FROM %s", TABLE_NAME)) .keyspace(keyspaceName) .build(); - try (CqlSession session = makeSession()) { - - //WHEN - QueryDTO.ClusterQueryCommanderResult result = clusterQueryCommander.execute(session, args); + //WHEN + QueryDTO.ClusterQueryCommanderResult result = clusterQueryCommander.execute(CLUSTER_ID, args); - //THEN - assertThat(result).isNotNull(); - assertThat(result.getRows()).isNotNull(); - } + //THEN + assertThat(result).isNotNull(); + assertThat(result.getRows()).isNotNull(); } } diff --git a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/ClusterNodeApi.java b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/ClusterNodeApi.java index ccfa7efd..1df2a8dd 100644 --- a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/ClusterNodeApi.java +++ b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/ClusterNodeApi.java @@ -1,10 +1,8 @@ package kr.hakdang.cassdio.web.route.cluster; -import com.datastax.oss.driver.api.core.CqlSession; -import kr.hakdang.cassdio.core.domain.cluster.ClusterNode; -import kr.hakdang.cassdio.core.domain.cluster.ClusterNodeGetCommander; -import kr.hakdang.cassdio.core.domain.cluster.ClusterNodeListCommander; -import kr.hakdang.cassdio.core.domain.cluster.ClusterConnector; +import kr.hakdang.cassdio.core.domain.cluster.node.ClusterNode; +import kr.hakdang.cassdio.core.domain.cluster.node.ClusterNodeGetCommander; +import kr.hakdang.cassdio.core.domain.cluster.node.ClusterNodeListCommander; import kr.hakdang.cassdio.web.common.dto.response.ApiResponse; import kr.hakdang.cassdio.web.common.dto.response.ItemListWithCursorResponse; import org.springframework.web.bind.annotation.GetMapping; @@ -24,17 +22,13 @@ @RestController @RequestMapping("/api/cassandra/cluster/{clusterId}") public class ClusterNodeApi { - - private final ClusterConnector clusterConnector; private final ClusterNodeListCommander clusterNodeListCommander; private final ClusterNodeGetCommander clusterNodeGetCommander; public ClusterNodeApi( - ClusterConnector clusterConnector, ClusterNodeListCommander clusterNodeListCommander, ClusterNodeGetCommander clusterNodeGetCommander ) { - this.clusterConnector = clusterConnector; this.clusterNodeListCommander = clusterNodeListCommander; this.clusterNodeGetCommander = clusterNodeGetCommander; } @@ -43,10 +37,8 @@ public ClusterNodeApi( public ApiResponse> nodeList( @PathVariable String clusterId ) { - try (CqlSession session = clusterConnector.makeSession(clusterId)) { - List nodes = clusterNodeListCommander.listNodes(session); - return ApiResponse.ok(ItemListWithCursorResponse.noMore(nodes)); - } + List nodes = clusterNodeListCommander.listNodes(clusterId); + return ApiResponse.ok(ItemListWithCursorResponse.noMore(nodes)); } @GetMapping("/node/{nodeId}") @@ -54,10 +46,8 @@ public ApiResponse nodeDetail( @PathVariable String clusterId, @PathVariable UUID nodeId ) { - try (CqlSession session = clusterConnector.makeSession(clusterId)) { - ClusterNode result = clusterNodeGetCommander.getNode(session, nodeId); - return ApiResponse.ok(result); - } + ClusterNode result = clusterNodeGetCommander.getNode(clusterId, nodeId); + return ApiResponse.ok(result); } } diff --git a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/client/ClusterClientApi.java b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/client/ClusterClientApi.java index 8785bb0c..261d3c45 100644 --- a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/client/ClusterClientApi.java +++ b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/client/ClusterClientApi.java @@ -1,7 +1,5 @@ package kr.hakdang.cassdio.web.route.cluster.client; -import com.datastax.oss.driver.api.core.CqlSession; -import kr.hakdang.cassdio.core.domain.cluster.ClusterConnector; import kr.hakdang.cassdio.core.domain.cluster.client.ClusterClientListCommander; import kr.hakdang.cassdio.core.domain.cluster.client.ClusterClientListResult; import kr.hakdang.cassdio.web.common.dto.response.ApiResponse; @@ -19,12 +17,9 @@ @RequestMapping("/api/cassandra/cluster/{clusterId}/client") @RestController public class ClusterClientApi { - - private final ClusterConnector clusterConnector; private final ClusterClientListCommander clusterClientListCommander; - public ClusterClientApi(ClusterConnector clusterConnector, ClusterClientListCommander clusterClientListCommander) { - this.clusterConnector = clusterConnector; + public ClusterClientApi(ClusterClientListCommander clusterClientListCommander) { this.clusterClientListCommander = clusterClientListCommander; } @@ -32,10 +27,8 @@ public ClusterClientApi(ClusterConnector clusterConnector, ClusterClientListComm public ApiResponse getClients( @PathVariable String clusterId ) { - try (CqlSession session = clusterConnector.makeSession(clusterId)) { - ClusterClientListResult result = clusterClientListCommander.getClients(session); - return ApiResponse.ok(result); - } + ClusterClientListResult result = clusterClientListCommander.getClients(clusterId); + return ApiResponse.ok(result); } } diff --git a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/compaction/CompactionMonitoringApi.java b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/compaction/CompactionMonitoringApi.java index 40e8b11a..4acdc12a 100644 --- a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/compaction/CompactionMonitoringApi.java +++ b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/compaction/CompactionMonitoringApi.java @@ -1,7 +1,5 @@ package kr.hakdang.cassdio.web.route.cluster.compaction; -import com.datastax.oss.driver.api.core.CqlSession; -import kr.hakdang.cassdio.core.domain.cluster.ClusterConnector; import kr.hakdang.cassdio.core.domain.cluster.compaction.CompactionHistoryListCommander; import kr.hakdang.cassdio.core.domain.cluster.compaction.CompactionHistoryListResult; import kr.hakdang.cassdio.web.common.dto.response.ApiResponse; @@ -20,12 +18,11 @@ @RequestMapping("/api/cassandra/cluster/{clusterId}") @RestController public class CompactionMonitoringApi { - - private final ClusterConnector clusterConnector; private final CompactionHistoryListCommander compactionHistoryListCommander; - public CompactionMonitoringApi(ClusterConnector clusterConnector, CompactionHistoryListCommander compactionHistoryListCommander) { - this.clusterConnector = clusterConnector; + public CompactionMonitoringApi( + CompactionHistoryListCommander compactionHistoryListCommander + ) { this.compactionHistoryListCommander = compactionHistoryListCommander; } @@ -34,10 +31,8 @@ public ApiResponse getCompactionHistories( @PathVariable String clusterId, @RequestParam(required = false) String keyspace ) { - try (CqlSession session = clusterConnector.makeSession(clusterId)) { - CompactionHistoryListResult result = compactionHistoryListCommander.getCompactionHistories(session, keyspace); - return ApiResponse.ok(result); - } + CompactionHistoryListResult result = compactionHistoryListCommander.getCompactionHistories(clusterId, keyspace); + return ApiResponse.ok(result); } } diff --git a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/ClusterKeyspaceApi.java b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/ClusterKeyspaceApi.java index 2e78ad2d..15f246ee 100644 --- a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/ClusterKeyspaceApi.java +++ b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/ClusterKeyspaceApi.java @@ -1,9 +1,8 @@ package kr.hakdang.cassdio.web.route.cluster.keyspace; -import com.datastax.oss.driver.api.core.CqlSession; import kr.hakdang.cassdio.common.CassdioConstants; import kr.hakdang.cassdio.core.domain.cluster.ClusterConnector; -import kr.hakdang.cassdio.core.domain.cluster.ClusterUtils; +import kr.hakdang.cassdio.core.domain.cluster.CqlSessionFactory; import kr.hakdang.cassdio.core.domain.cluster.CqlSessionSelectResults; import kr.hakdang.cassdio.core.domain.cluster.keyspace.ClusterKeyspaceCommander; import kr.hakdang.cassdio.core.domain.cluster.keyspace.ClusterKeyspaceProvider; @@ -12,6 +11,7 @@ import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.TableDTO; import kr.hakdang.cassdio.web.common.dto.response.ApiResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -33,7 +33,8 @@ @RestController @RequestMapping("/api/cassandra/cluster/{clusterId}") public class ClusterKeyspaceApi { - + @Autowired + private CqlSessionFactory cqlSessionFactory; private final ClusterConnector clusterConnector; private final ClusterKeyspaceProvider clusterKeyspaceProvider; private final ClusterKeyspaceCommander clusterKeyspaceCommander; @@ -54,9 +55,7 @@ public ClusterKeyspaceApi( public ApiResponse keyspaceList( @PathVariable(name = CassdioConstants.CLUSTER_ID_PATH) String clusterId ) { - try (CqlSession session = clusterConnector.makeSession(clusterId)) { - return ApiResponse.ok(clusterKeyspaceCommander.generalKeyspaceList(session)); - } + return ApiResponse.ok(clusterKeyspaceCommander.generalKeyspaceList(clusterId)); } @@ -66,15 +65,13 @@ public ApiResponse> keyspaceNames( @RequestParam(required = false, defaultValue = "false") boolean cacheEvict ) { Map responseMap = new HashMap<>(); - try (CqlSession session = clusterConnector.makeSession(clusterId)) { - if (cacheEvict) { - clusterKeyspaceProvider.keyspaceNameListCacheEvict(clusterId); - } - - List allKeyspaceList = clusterKeyspaceProvider.keyspaceNameResultList(session, clusterId); - responseMap.put("keyspaceNameList", allKeyspaceList); + if (cacheEvict) { + clusterKeyspaceProvider.keyspaceNameListCacheEvict(clusterId); } + List allKeyspaceList = clusterKeyspaceProvider.keyspaceNameResultList(clusterId); + responseMap.put("keyspaceNameList", allKeyspaceList); + return ApiResponse.ok(responseMap); } @@ -87,26 +84,24 @@ public ApiResponse> keyspaceDetail( Map responseMap = new HashMap<>(); //TODO : keyspace validation - try (CqlSession session = clusterConnector.makeSession(clusterId, keyspace)) { - var describeArgs = KeyspaceDTO.ClusterKeyspaceDescribeArgs.builder() - .keyspace(keyspace) - .withChildren(false) - .pretty(true) - .build(); + var describeArgs = KeyspaceDTO.ClusterKeyspaceDescribeArgs.builder() + .keyspace(keyspace) + .withChildren(false) + .pretty(true) + .build(); - responseMap.put("describe", clusterKeyspaceCommander.describe(session, describeArgs)); - responseMap.put("detail", clusterKeyspaceCommander.keyspaceDetail(session, keyspace)); + responseMap.put("describe", clusterKeyspaceCommander.describe(clusterId, describeArgs)); + responseMap.put("detail", clusterKeyspaceCommander.keyspaceDetail(clusterId, keyspace)); - if (withTableList) { //TODO 해당 값 외에 view 등의 기능은 탭을 생성하여 화면 이동하면 호출할 수 있도록 개발 예정 - TableDTO.ClusterTableListArgs args = TableDTO.ClusterTableListArgs.builder() - .keyspace(keyspace) - .pageSize(100) - .build(); + if (withTableList) { //TODO 해당 값 외에 view 등의 기능은 탭을 생성하여 화면 이동하면 호출할 수 있도록 개발 예정 + TableDTO.ClusterTableListArgs args = TableDTO.ClusterTableListArgs.builder() + .keyspace(keyspace) + .pageSize(100) + .build(); - CqlSessionSelectResults tableListResult = clusterTableListCommander.tableList(session, args); + CqlSessionSelectResults tableListResult = clusterTableListCommander.tableList(clusterId, args); - responseMap.put("tableList", tableListResult); - } + responseMap.put("tableList", tableListResult); } return ApiResponse.ok(responseMap); @@ -117,15 +112,7 @@ public ApiResponse keyspaceDrop( @PathVariable(name = CassdioConstants.CLUSTER_ID_PATH) String clusterId, @PathVariable String keyspace ) { - - //TODO : keyspace validation - try (CqlSession session = clusterConnector.makeSession(clusterId, keyspace)) { - if (ClusterUtils.isSystemKeyspace(session.getContext(), keyspace)) { - throw new IllegalArgumentException("System Keyspace!"); - } - - clusterKeyspaceCommander.keyspaceDrop(session, keyspace); - } + clusterKeyspaceCommander.keyspaceDrop(clusterId, keyspace); return ApiResponse.ok(); } diff --git a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/table/ClusterTableApi.java b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/table/ClusterTableApi.java index 5913510b..4a494d8e 100644 --- a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/table/ClusterTableApi.java +++ b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/table/ClusterTableApi.java @@ -1,15 +1,13 @@ package kr.hakdang.cassdio.web.route.cluster.keyspace.table; -import com.datastax.oss.driver.api.core.CqlSession; import jakarta.validation.Valid; -import kr.hakdang.cassdio.core.domain.cluster.ClusterConnector; import kr.hakdang.cassdio.core.domain.cluster.CqlSessionSelectResult; import kr.hakdang.cassdio.core.domain.cluster.CqlSessionSelectResults; -import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.ClusterTableRowCommander; -import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.TableDTO; import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.ClusterTableCommander; import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.ClusterTableGetCommander; import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.ClusterTableListCommander; +import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.ClusterTableRowCommander; +import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.TableDTO; import kr.hakdang.cassdio.core.domain.cluster.keyspace.table.column.ClusterTableColumnCommander; import kr.hakdang.cassdio.web.common.dto.request.CursorRequest; import kr.hakdang.cassdio.web.common.dto.response.ApiResponse; @@ -17,7 +15,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -33,9 +30,6 @@ @RestController @RequestMapping("/api/cassandra/cluster/{clusterId}/keyspace/{keyspace}") public class ClusterTableApi { - - private final ClusterTableProvider clusterTableProvider; - private final ClusterConnector clusterConnector; private final ClusterTableCommander clusterTableCommander; private final ClusterTableListCommander clusterTableListCommander; private final ClusterTableGetCommander clusterTableGetCommander; @@ -43,13 +37,12 @@ public class ClusterTableApi { private final ClusterTableColumnCommander clusterTableColumnCommander; public ClusterTableApi( - ClusterTableProvider clusterTableProvider, - ClusterConnector clusterConnector, - ClusterTableCommander clusterTableCommander, ClusterTableListCommander clusterTableListCommander, ClusterTableGetCommander clusterTableGetCommander, ClusterTableRowCommander clusterTableRowCommander, + ClusterTableCommander clusterTableCommander, + ClusterTableListCommander clusterTableListCommander, + ClusterTableGetCommander clusterTableGetCommander, + ClusterTableRowCommander clusterTableRowCommander, ClusterTableColumnCommander clusterTableColumnCommander ) { - this.clusterTableProvider = clusterTableProvider; - this.clusterConnector = clusterConnector; this.clusterTableCommander = clusterTableCommander; this.clusterTableListCommander = clusterTableListCommander; this.clusterTableGetCommander = clusterTableGetCommander; @@ -64,17 +57,15 @@ public ApiResponse> listTables( @Valid CursorRequest cursorRequest ) { Map responseMap = new HashMap<>(); - try (CqlSession session = clusterConnector.makeSession(clusterId)) { - TableDTO.ClusterTableListArgs args = TableDTO.ClusterTableListArgs.builder() - .keyspace(keyspace) - .pageSize(cursorRequest.getSize()) - .cursor(cursorRequest.getCursor()) - .build(); + TableDTO.ClusterTableListArgs args = TableDTO.ClusterTableListArgs.builder() + .keyspace(keyspace) + .pageSize(cursorRequest.getSize()) + .cursor(cursorRequest.getCursor()) + .build(); - CqlSessionSelectResults tableListResult = clusterTableListCommander.tableList(session, args); + CqlSessionSelectResults tableListResult = clusterTableListCommander.tableList(clusterId, args); - responseMap.put("tableList", tableListResult); - } + responseMap.put("tableList", tableListResult); return ApiResponse.ok(responseMap); } @@ -87,20 +78,17 @@ public ApiResponse> getTable( ) { Map responseMap = new HashMap<>(); - try (CqlSession session = clusterConnector.makeSession(clusterId, keyspace)) { - - TableDTO.ClusterTableGetArgs tableGetArgs = TableDTO.ClusterTableGetArgs.builder() - .keyspace(keyspace) - .table(table) - .build(); + TableDTO.ClusterTableGetArgs tableGetArgs = TableDTO.ClusterTableGetArgs.builder() + .keyspace(keyspace) + .table(table) + .build(); - CqlSessionSelectResult result = clusterTableGetCommander.tableDetail(session, tableGetArgs); + CqlSessionSelectResult result = clusterTableGetCommander.tableDetail(clusterId, tableGetArgs); - responseMap.put("detail", result); + responseMap.put("detail", result); - responseMap.put("describe", clusterTableCommander.tableDescribe(session, keyspace, table)); - responseMap.put("columnList", clusterTableColumnCommander.columnList(session, keyspace, table)); - } + responseMap.put("describe", clusterTableCommander.tableDescribe(clusterId, keyspace, table)); + responseMap.put("columnList", clusterTableColumnCommander.columnList(clusterId, keyspace, table)); return ApiResponse.ok(responseMap); } @@ -113,9 +101,7 @@ public ApiResponse> getTableColumn( ) { Map responseMap = new HashMap<>(); - try (CqlSession session = clusterConnector.makeSession(clusterId, keyspace)) { - responseMap.put("columnList", clusterTableColumnCommander.columnList(session, keyspace, table)); - } + responseMap.put("columnList", clusterTableColumnCommander.columnList(clusterId, keyspace, table)); return ApiResponse.ok(responseMap); } @@ -128,15 +114,13 @@ public ApiResponse> tableRow( @ModelAttribute ClusterTableRowRequest request ) { Map responseMap = new HashMap<>(); - try (CqlSession session = clusterConnector.makeSession(clusterId)) { - CqlSessionSelectResults result1 = clusterTableRowCommander.rowSelect(session, request.makeArgs(keyspace, table)); + CqlSessionSelectResults result1 = clusterTableRowCommander.rowSelect(clusterId, request.makeArgs(keyspace, table)); - responseMap.put("nextCursor", result1.getNextCursor()); - responseMap.put("rows", result1.getRows()); - responseMap.put("rowHeader", result1.getRowHeader()); + responseMap.put("nextCursor", result1.getNextCursor()); + responseMap.put("rows", result1.getRows()); + responseMap.put("rowHeader", result1.getRowHeader()); - responseMap.put("columnList", clusterTableColumnCommander.columnList(session, keyspace, table)); - } + responseMap.put("columnList", clusterTableColumnCommander.columnList(clusterId, keyspace, table)); return ApiResponse.ok(responseMap); } @@ -148,12 +132,9 @@ public ApiResponse tableDrop( @PathVariable String keyspace, @PathVariable String table ) { - try (CqlSession session = clusterConnector.makeSession(clusterId)) { + clusterTableCommander.tableDrop(clusterId, keyspace, table); - clusterTableCommander.tableDrop(session, keyspace, table); - - return ApiResponse.ok(); - } + return ApiResponse.ok(); } //권한 추가해서 ADMIN 만 동작할 수 있도록 해야함. @@ -163,12 +144,9 @@ public ApiResponse tableTruncate( @PathVariable String keyspace, @PathVariable String table ) { - try (CqlSession session = clusterConnector.makeSession(clusterId)) { - - clusterTableCommander.tableTruncate(session, keyspace, table); + clusterTableCommander.tableTruncate(clusterId, keyspace, table); - return ApiResponse.ok(); - } + return ApiResponse.ok(); } // @PostMapping("/table/{table}/row/insert/query") diff --git a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/table/ClusterTableProvider.java b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/table/ClusterTableProvider.java deleted file mode 100644 index 21fad3d6..00000000 --- a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/table/ClusterTableProvider.java +++ /dev/null @@ -1,23 +0,0 @@ -package kr.hakdang.cassdio.web.route.cluster.keyspace.table; - -import kr.hakdang.cassdio.core.domain.cluster.ClusterConnector; -import org.springframework.stereotype.Service; - -/** - * ClusterTableProvider - * - * @author seungh0 - * @since 2024-07-04 - */ -@Service -public class ClusterTableProvider { - - private final ClusterConnector clusterConnector; - - public ClusterTableProvider( - ClusterConnector clusterConnector - ) { - this.clusterConnector = clusterConnector; - } - -} diff --git a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/udt/ClusterUDTTypeReader.java b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/udt/ClusterUDTTypeReader.java index d0db20bb..446fae80 100644 --- a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/udt/ClusterUDTTypeReader.java +++ b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/udt/ClusterUDTTypeReader.java @@ -1,7 +1,5 @@ package kr.hakdang.cassdio.web.route.cluster.keyspace.udt; -import com.datastax.oss.driver.api.core.CqlSession; -import kr.hakdang.cassdio.core.domain.cluster.ClusterConnector; import kr.hakdang.cassdio.core.domain.cluster.keyspace.udt.ClusterUDTType; import kr.hakdang.cassdio.core.domain.cluster.keyspace.udt.ClusterUDTTypeArgs.ClusterUDTTypeGetArgs; import kr.hakdang.cassdio.core.domain.cluster.keyspace.udt.ClusterUDTTypeArgs.ClusterUDTTypeListArgs; @@ -21,40 +19,32 @@ */ @Service public class ClusterUDTTypeReader { - - private final ClusterConnector clusterConnector; private final ClusterUDTTypeListCommander clusterUDTTypeListCommander; private final ClusterUDTTypeGetCommander clusterUDTTypeGetCommander; public ClusterUDTTypeReader( - ClusterConnector clusterConnector, ClusterUDTTypeListCommander clusterUDTTypeListCommander, ClusterUDTTypeGetCommander clusterUDTTypeGetCommander ) { - this.clusterConnector = clusterConnector; this.clusterUDTTypeListCommander = clusterUDTTypeListCommander; this.clusterUDTTypeGetCommander = clusterUDTTypeGetCommander; } public ItemListWithCursorResponse listTypes(String clusterId, String keyspace, CursorRequest cursorRequest) { - try (CqlSession session = clusterConnector.makeSession(clusterId)) { - ClusterUDTTypeListResult result = clusterUDTTypeListCommander.listTypes(session, ClusterUDTTypeListArgs.builder() - .keyspace(keyspace) - .pageSize(cursorRequest.getSize()) - .nextPageState(cursorRequest.getCursor()) - .build()); + ClusterUDTTypeListResult result = clusterUDTTypeListCommander.listTypes(clusterId, ClusterUDTTypeListArgs.builder() + .keyspace(keyspace) + .pageSize(cursorRequest.getSize()) + .nextPageState(cursorRequest.getCursor()) + .build()); - return ItemListWithCursorResponse.of(result.getTypes(), CursorResponse.withNext(result.getNextPageState())); - } + return ItemListWithCursorResponse.of(result.getTypes(), CursorResponse.withNext(result.getNextPageState())); } public ClusterUDTType getType(String clusterId, String keyspace, String type) { - try (CqlSession session = clusterConnector.makeSession(clusterId)) { - return clusterUDTTypeGetCommander.getType(session, ClusterUDTTypeGetArgs.builder() - .keyspace(keyspace) - .type(type) - .build()); - } + return clusterUDTTypeGetCommander.getType(clusterId, ClusterUDTTypeGetArgs.builder() + .keyspace(keyspace) + .type(type) + .build()); } } diff --git a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/query/ClusterQueryApi.java b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/query/ClusterQueryApi.java index 057cf37c..888379d4 100644 --- a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/query/ClusterQueryApi.java +++ b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/query/ClusterQueryApi.java @@ -1,7 +1,5 @@ package kr.hakdang.cassdio.web.route.cluster.query; -import com.datastax.oss.driver.api.core.CqlSession; -import kr.hakdang.cassdio.core.domain.cluster.ClusterConnector; import kr.hakdang.cassdio.core.domain.cluster.query.ClusterQueryCommander; import kr.hakdang.cassdio.core.domain.cluster.query.QueryDTO; import kr.hakdang.cassdio.web.common.dto.response.ApiResponse; @@ -25,15 +23,11 @@ @RestController @RequestMapping("/api/cassandra/cluster") public class ClusterQueryApi { - - private final ClusterConnector clusterConnector; private final ClusterQueryCommander clusterQueryCommander; public ClusterQueryApi( - ClusterConnector clusterConnector, ClusterQueryCommander clusterQueryCommander ) { - this.clusterConnector = clusterConnector; this.clusterQueryCommander = clusterQueryCommander; } @@ -43,20 +37,19 @@ public ApiResponse> clusterQueryCommand( @PathVariable(required = false) String keyspace, @RequestBody ClusterQueryRequest request ) { - log.info("clusterId : {}, keyspace : {}", clusterId, keyspace); - Map responseMap = new HashMap<>(); - try (CqlSession session = clusterConnector.makeSession(clusterId, keyspace)) { - QueryDTO.ClusterQueryCommanderResult result = clusterQueryCommander.execute(session, request.makeArgs()); - - responseMap.put("wasApplied", result.isWasApplied()); - responseMap.put("nextCursor", result.getNextCursor()); - responseMap.put("rows", result.getRows()); - responseMap.put("rowHeader", result.getRowHeader()); - if (request.isTrace()) { - responseMap.put("queryTrace", result.getQueryTrace()); - } + QueryDTO.ClusterQueryCommanderResult result = clusterQueryCommander.execute( + clusterId, + request.makeArgs(keyspace) + ); + + responseMap.put("wasApplied", result.isWasApplied()); + responseMap.put("nextCursor", result.getNextCursor()); + responseMap.put("rows", result.getRows()); + responseMap.put("rowHeader", result.getRowHeader()); + if (request.isTrace()) { + responseMap.put("queryTrace", result.getQueryTrace()); } return ApiResponse.ok(responseMap); diff --git a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/query/ClusterQueryRequest.java b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/query/ClusterQueryRequest.java index c837430a..bc70599d 100644 --- a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/query/ClusterQueryRequest.java +++ b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/query/ClusterQueryRequest.java @@ -25,16 +25,18 @@ public class ClusterQueryRequest { private boolean trace = false; @Builder - public ClusterQueryRequest(String query, String cursor, int pageSize, int timeoutSeconds, boolean trace) { + public ClusterQueryRequest(String query, String cursor, int pageSize, int timeoutSeconds, int consistencyLevelProtocolCode, boolean trace) { this.query = query; this.cursor = cursor; this.pageSize = pageSize; this.timeoutSeconds = timeoutSeconds; + this.consistencyLevelProtocolCode = consistencyLevelProtocolCode; this.trace = trace; } - public QueryDTO.ClusterQueryCommanderArgs makeArgs() { + public QueryDTO.ClusterQueryCommanderArgs makeArgs(String keyspace) { return QueryDTO.ClusterQueryCommanderArgs.builder() + .keyspace(keyspace) .query(query) .cursor(cursor) .pageSize(pageSize) From 9aeca361abafb193944f6ae732496fe5c58e3096 Mon Sep 17 00:00:00 2001 From: akageun Date: Tue, 30 Jul 2024 20:03:24 +0900 Subject: [PATCH 07/27] UI Refactoring --- .../keyspace/table/ClusterTableApi.java | 2 +- .../src/components/cluster/cluster-list.js | 2 +- .../src/components/cluster/data-row-item.js | 20 +- .../components/cluster/keyspace-table-list.js | 28 ++- .../cluster/modal/table-data-manage-modal.js | 212 ------------------ .../cluster/modal/table-detail-modal.js | 28 +-- .../src/main/webapp/src/hooks/useCassdio.js | 79 +------ .../src/main/webapp/src/hooks/useCluster.js | 82 +++---- .../src/main/webapp/src/hooks/useKeyspace.js | 24 +- .../src/main/webapp/src/hooks/useTable.js | 72 +++--- .../src/pages/cluster/cluster-client-page.js | 35 +-- .../pages/cluster/cluster-dashboard-page.js | 33 ++- .../cluster-keyspace-comapction-page.js | 40 ++-- .../pages/cluster/cluster-keyspace-page.js | 50 +++-- .../src/pages/cluster/cluster-metrics-page.js | 2 +- .../src/pages/cluster/cluster-nodes-page.js | 30 +-- .../src/pages/cluster/cluster-query-page.js | 24 +- .../src/pages/cluster/cluster-table-page.js | 37 ++- .../main/webapp/src/remotes/bootstrapApi.js | 14 +- .../webapp/src/remotes/clusterClientApi.js | 16 ++ .../remotes/clusterCompactionHistoryApi.js | 17 ++ .../webapp/src/remotes/clusterDeleteApi.js | 15 ++ .../webapp/src/remotes/clusterDetailApi.js | 15 ++ .../webapp/src/remotes/clusterKeyspaceApi.js | 23 -- .../src/remotes/clusterKeyspaceDetailApi.js | 17 ++ .../src/remotes/clusterKeyspaceListApi.js | 15 ++ .../src/remotes/clusterKeyspaceNameListApi.js | 17 ++ .../main/webapp/src/remotes/clusterListApi.js | 15 ++ .../webapp/src/remotes/clusterNodesApi.js | 16 ++ .../webapp/src/remotes/clusterQueryApi.js | 8 +- .../main/webapp/src/remotes/clusterSaveApi.js | 29 +++ .../webapp/src/remotes/clusterTableApi.js | 16 -- .../src/remotes/clusterTableDetailApi.js | 20 ++ .../webapp/src/remotes/clusterTableDropApi.js | 18 ++ .../webapp/src/remotes/clusterTableListApi.js | 15 ++ .../webapp/src/remotes/clusterTableRowApi.js | 22 ++ .../src/remotes/clusterTableTruncateApi.js | 18 ++ .../src/main/webapp/src/routers/router.js | 20 +- .../src/main/webapp/src/utils/axiosUtils.js | 6 +- 39 files changed, 532 insertions(+), 620 deletions(-) delete mode 100644 cassdio-web/src/main/webapp/src/components/cluster/modal/table-data-manage-modal.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterClientApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterCompactionHistoryApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterDeleteApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterDetailApi.js delete mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterKeyspaceApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterKeyspaceDetailApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterKeyspaceListApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterKeyspaceNameListApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterListApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterNodesApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterSaveApi.js delete mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterTableApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterTableDetailApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterTableDropApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterTableListApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterTableRowApi.js create mode 100644 cassdio-web/src/main/webapp/src/remotes/clusterTableTruncateApi.js diff --git a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/table/ClusterTableApi.java b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/table/ClusterTableApi.java index 4a494d8e..372362c6 100644 --- a/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/table/ClusterTableApi.java +++ b/cassdio-web/src/main/java/kr/hakdang/cassdio/web/route/cluster/keyspace/table/ClusterTableApi.java @@ -126,7 +126,7 @@ public ApiResponse> tableRow( } //권한 추가해서 ADMIN 만 동작할 수 있도록 해야함. - @DeleteMapping("/table/{table}") + @DeleteMapping("/table/{table}/drop") public ApiResponse tableDrop( @PathVariable String clusterId, @PathVariable String keyspace, diff --git a/cassdio-web/src/main/webapp/src/components/cluster/cluster-list.js b/cassdio-web/src/main/webapp/src/components/cluster/cluster-list.js index 30808942..f692d3ed 100644 --- a/cassdio-web/src/main/webapp/src/components/cluster/cluster-list.js +++ b/cassdio-web/src/main/webapp/src/components/cluster/cluster-list.js @@ -4,7 +4,7 @@ import {Link} from "react-router-dom"; import Spinner from "components/common/spinner"; import ClusterManageModal from "./modal/cluster-manage-modal"; -import useCluster from "../../hooks/useCluster"; +import useCluster from "hooks/useCluster"; const ClusterList = () => { diff --git a/cassdio-web/src/main/webapp/src/components/cluster/data-row-item.js b/cassdio-web/src/main/webapp/src/components/cluster/data-row-item.js index 69107e79..e37f1088 100644 --- a/cassdio-web/src/main/webapp/src/components/cluster/data-row-item.js +++ b/cassdio-web/src/main/webapp/src/components/cluster/data-row-item.js @@ -7,16 +7,16 @@ export default function DataRowItem(props) { const [renderData, setRenderData] = useState(); - function isJson(item) { - let value = typeof item !== "string" ? JSON.stringify(item) : item; - try { - value = JSON.parse(value); - } catch (e) { - return false; - } - - return typeof value === "object" && value !== null; - } + // function isJson(item) { + // let value = typeof item !== "string" ? JSON.stringify(item) : item; + // try { + // value = JSON.parse(value); + // } catch (e) { + // return false; + // } + // + // return typeof value === "object" && value !== null; + // } const handleCopyClipBoard = async (data) => { try { diff --git a/cassdio-web/src/main/webapp/src/components/cluster/keyspace-table-list.js b/cassdio-web/src/main/webapp/src/components/cluster/keyspace-table-list.js index 2970262b..26a46e7f 100644 --- a/cassdio-web/src/main/webapp/src/components/cluster/keyspace-table-list.js +++ b/cassdio-web/src/main/webapp/src/components/cluster/keyspace-table-list.js @@ -1,8 +1,7 @@ import {Link} from "react-router-dom"; import TableDetailModal from "./modal/table-detail-modal"; import {useEffect, useState} from "react"; -import axios from "axios"; -import useCassdio from "../../hooks/useCassdio"; +import clusterTableListApi from "remotes/clusterTableListApi"; const KeyspaceTableList = ({clusterId, keyspaceName, tableList}) => { const [moreLoading, setMoreLoading] = useState(false); @@ -12,22 +11,21 @@ const KeyspaceTableList = ({clusterId, keyspaceName, tableList}) => { const [rows, setRows] = useState(tableList.rows || []); const [nextCursor, setNextCursor] = useState(tableList.nextCursor); - const {errorCatch} = useCassdio(); - const moreList = (cursor) => { setMoreLoading(true) - axios({ - method: "GET", - url: `/api/cassandra/cluster/${clusterId}/keyspace/${keyspaceName}/table`, - params: { - cursor: cursor + + clusterTableListApi({ + clusterId: clusterId, + keyspaceName: keyspaceName, + cursor: cursor, + }).then((data) => { + if (!data.ok) { + return; } - }).then((response) => { - setRows([...rows, ...response.data.result.tableList.rows]); - setNextCursor(response.data.result.tableList.nextCursor); - }).catch((error) => { - errorCatch(error) + setRows([...rows, ...data.result.tableList.rows]); + setNextCursor(data.result.tableList.nextCursor); + }).finally(() => { setMoreLoading(false) }); @@ -43,7 +41,7 @@ const KeyspaceTableList = ({clusterId, keyspaceName, tableList}) => { }, []); return ( -
+
    { rows && rows.length <= 0 ? <> diff --git a/cassdio-web/src/main/webapp/src/components/cluster/modal/table-data-manage-modal.js b/cassdio-web/src/main/webapp/src/components/cluster/modal/table-data-manage-modal.js deleted file mode 100644 index a70ab74e..00000000 --- a/cassdio-web/src/main/webapp/src/components/cluster/modal/table-data-manage-modal.js +++ /dev/null @@ -1,212 +0,0 @@ -import {useEffect, useState} from "react"; -import {Modal} from "react-bootstrap"; -import useCassdio from "hooks/useCassdio"; -import axios from "axios"; - -const TableDataManageModal = (props) => { - - const show = props.show; - const handleClose = props.handleClose; - - const clusterId = props.clusterId; - const keyspaceName = props.keyspaceName; - const tableName = props.tableName; - - const {errorCatch} = useCassdio(); - const [columnList, setColumnList] = useState({ - rows: [], - columnHeader: [], - }) - - const [columnListLoading, setColumnListLoading] = useState(false); - - const kindSort = { - "partition_key": 0, - "clustering": 1, - } - - function ascSort(a, b, compositeSort = undefined) { - if (a > b) { - return compositeSort ? compositeSort : 1; - } - - if (a < b) { - return compositeSort ? compositeSort : -1; - } - - return compositeSort ? compositeSort : 0; - } - - function descSort(a, b, compositeSort = undefined) { - if (a > b) { - return -1; - } - - if (a < b) { - return 1; - } - - return 0; - } - - const [dataManage, setDataManage] = useState({}); - - const changeHandler = e => { - // Deriving the filter that a checkbox is associated too, and getting its value on change - const property = e.target.name; - const val = e.target.value; - setDataManage( - prevState => { - const filters = prevState || {}; - filters[property] = val; - return { - ...filters, - }; - } - ); - }; - - function deMakeInsertQuery() { - - axios({ - method: "POST", - url: `/api/cassandra/cluster/${clusterId}/keyspace/${keyspaceName}/table/${tableName}/row/insert/query`, - //해당 API 에는 column_name, kind, type 이 필수값이어야만 함.(TODO : testcase 추가 필요) - data: dataManage - }).then((response) => { - console.log("response : ", response.data.result); - - }).catch((error) => { - errorCatch(error) - }).finally(() => { - }); - - } - - useEffect(() => { - //show component - setColumnListLoading(true); - - //수정처리일 경우 단건조회 형태로 조회하고, withColumnList 로 하여 컬럼정보를 가져올 수 있도록 한다. - - axios({ - method: "GET", - url: `/api/cassandra/cluster/${clusterId}/keyspace/${keyspaceName}/table/${tableName}/column`, - //해당 API 에는 column_name, kind, type 이 필수값이어야만 함.(TODO : testcase 추가 필요) - params: {} - }).then((response) => { - console.log("response : ", response.data.result); - - //TODO : 정렬 고도화 - const tempRows = response.data.result.columnList.rows; - tempRows.sort(function (a, b, compositeSort) { - const aKindSort = kindSort[a.kind] || 2; - const bKindSort = kindSort[b.kind] || 2; - - console.log("kind", aKindSort, bKindSort, a, b) - - return descSort(aKindSort, bKindSort, descSort(a.clustering_order, b.clustering_order, undefined)) - }); - - setColumnList({ - rows: tempRows, - rowHeader: response.data.result.columnList.rowHeader, - }) - }).catch((error) => { - errorCatch(error) - }).finally(() => { - setColumnListLoading(false) - }); - - return () => { - //hide component - - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return ( - <> - - - Table Data Manage(New or Modify) - - - { - columnListLoading ? <> -
    -
    - Loading... -
    -
    - : <> - - {/*//TODO : 개발 중*/} - - - - - - - - - - - - { - columnList.rows.map((row, rowIndex) => { - return ( - - { - <> - - - - - - } - - ) - }) - } - -
    TTL
    Timestamp
    IfExist
    - {row['column_name']} - - {row['kind']} - - {row['type']} - - {/* TODO : type 이 int 면 number, 그외 것들은 text 로 처리?*/} - - - -
    - - - - } - - -
    - - - - -
    - - ) -} - -export default TableDataManageModal; diff --git a/cassdio-web/src/main/webapp/src/components/cluster/modal/table-detail-modal.js b/cassdio-web/src/main/webapp/src/components/cluster/modal/table-detail-modal.js index d6fa05b2..ab7ba6c1 100644 --- a/cassdio-web/src/main/webapp/src/components/cluster/modal/table-detail-modal.js +++ b/cassdio-web/src/main/webapp/src/components/cluster/modal/table-detail-modal.js @@ -4,7 +4,7 @@ import TableDetailModalInfo from "./detail/table-detail-modal-info"; import TableDetailModalDescribe from "./detail/table-detail-modal-describe"; import TableDetailModalColumnList from "./detail/table-detail-modal-column-list"; import {CassdioUtils} from "utils/cassdioUtils"; -import clusterTableDetailApi from "remotes/clusterTableApi"; +import clusterTableDetailApi from "remotes/clusterTableDetailApi"; const TableDetailModal = ({show, handleClose, clusterId, keyspaceName, tableName}) => { @@ -31,22 +31,22 @@ const TableDetailModal = ({show, handleClose, clusterId, keyspaceName, tableName clusterTableDetailApi({ clusterId, keyspaceName, tableName - }) - .then((response) => { - const sortedColumnList = CassdioUtils.columnListSorting( - response.data.result.columnList - ); + }).then((data) => { + if (!data.ok) { + return; + } - setTableInfo({ - detail: response.data.result.detail, - describe: response.data.result.describe, - columnList: sortedColumnList, - }) + const sortedColumnList = CassdioUtils.columnListSorting( + data.result.columnList + ); + setTableInfo({ + detail: data.result.detail, + describe: data.result.describe, + columnList: sortedColumnList, }) - .catch((error) => { - console.error("error : ", error); - }) + + }) .finally(() => { setTableLoading(false) }); diff --git a/cassdio-web/src/main/webapp/src/hooks/useCassdio.js b/cassdio-web/src/main/webapp/src/hooks/useCassdio.js index c6b62af3..0f402a9e 100644 --- a/cassdio-web/src/main/webapp/src/hooks/useCassdio.js +++ b/cassdio-web/src/main/webapp/src/hooks/useCassdio.js @@ -1,81 +1,4 @@ -import axios from "axios"; -import {useCassdioDispatch} from "../context/cassdioContext"; -import {toast} from "react-toastify"; - - export default function useCassdio() { - const cassdioDispatcher = useCassdioDispatch(); - - function doBootstrap() { - cassdioDispatcher({ - type: "SET_BOOTSTRAP_LOADING", - bootstrapLoading: true, - }) - axios({ - method: "GET", - url: `/api/bootstrap`, - params: {} - }).then((response) => { - cassdioDispatcher({ - type: "SET_SYSTEM_AVAILABLE", - systemAvailable: response.data.result.systemAvailable, - }) - - }).catch((error) => { - errorCatch(error); - }).finally(() => { - cassdioDispatcher({ - type: "SET_BOOTSTRAP_LOADING", - bootstrapLoading: false, - }) - }); - } - - function errorCatch(error) { - if (axios.isAxiosError(error)) { - const {message} = error; - const {method, url} = error.config; - const {status, statusText, data} = error.response; - - console.error( - `[API] ${method?.toUpperCase()} ${url} | Error ${status} ${statusText} | ${message}`, error - ); - - switch (status) { - case 400: - toast.warn(`Invalid request : ${status}`); - break; - case 401: { - toast.warn(`Unauthorized error : ${status}`); - break; - } - case 403: { - toast.warn(`Forbidden error : ${status}`); - break; - } - case 404: { - toast.warn(`Not Found : ${status}`); - break; - } - case 500: { - toast.error(`Internal Server Error : ${status}\n ${data.message}`); - break; - } - default: { - toast.error(`Error : ${status}, ${data.message}`); - } - } - } else if (error instanceof Error && error.name === "TimeoutError") { - console.error(`[API] | TimeError ${error.toString()}`); - toast.error(`Timeout ${0}`); - } else { - console.error(`[API] | Error ${error.toString()}`); - toast.error(`Error ${0}, ${error.toString()}`); - } - } - return { - doBootstrap, - errorCatch, - } + return {} } diff --git a/cassdio-web/src/main/webapp/src/hooks/useCluster.js b/cassdio-web/src/main/webapp/src/hooks/useCluster.js index 585ffa6d..b1361006 100644 --- a/cassdio-web/src/main/webapp/src/hooks/useCluster.js +++ b/cassdio-web/src/main/webapp/src/hooks/useCluster.js @@ -1,12 +1,12 @@ -import axios from "axios"; - -import useCassdio from "hooks/useCassdio"; import {toast} from "react-toastify"; import {useState} from "react"; -export default function useCluster() { - const {errorCatch} = useCassdio(); +import clusterListApi from "remotes/clusterListApi"; +import clusterDeleteApi from "remotes/clusterDeleteApi"; +import clusterDetailApi from "remotes/clusterDetailApi"; +import clusterSaveApi from "remotes/clusterSaveApi"; +export default function useCluster() { const [clustersLoading, setClustersLoading] = useState(false); const [clusters, setClusters] = useState([]); const [clusterDetailLoading, setClusterDetailLoading] = useState(false); @@ -14,14 +14,13 @@ export default function useCluster() { const doGetClusterList = () => { setClustersLoading(true) - axios({ - method: "GET", - url: `/api/cassandra/cluster`, - params: {} - }).then((response) => { - setClusters(response.data.result.clusters) - }).catch((error) => { - errorCatch(error) + clusterListApi( + ).then((data) => { + if (!data.ok) { + return; + } + + setClusters(data.result.clusters) }).finally(() => { setClustersLoading(false) }); @@ -32,15 +31,15 @@ export default function useCluster() { return; } - axios({ - method: "DELETE", - url: `/api/cassandra/cluster/${clusterId}`, - params: {} - }).then((response) => { + clusterDeleteApi({ + clusterId: clusterId + }).then((data) => { + if (!data.ok) { + return; + } + toast.info("Complete"); doGetClusterList(); - }).catch((error) => { - errorCatch(error) }).finally(() => { }); @@ -90,30 +89,17 @@ export default function useCluster() { setSaveLoading(true); - let method = "POST" - let url = "/api/cassandra/cluster"; - if (clusterId) { - method = "PUT"; - url = `/api/cassandra/cluster/${clusterId}`; - } + clusterSaveApi({ + clusterId, + clusterInfo + }).then((data) => { + if (!data.ok) { + return; + } - axios({ - method: method, - url: url, - data: { - contactPoints: clusterInfo.contactPoints, - port: clusterInfo.port, - localDatacenter: clusterInfo.localDatacenter, - username: clusterInfo.username, - password: clusterInfo.password, - memo : clusterInfo.memo, - }, - }).then((response) => { doGetClusterList(); toast.info("Complete"); handleClose(); - }).catch((error) => { - errorCatch(error); }).finally(() => { setSaveLoading(false); }) @@ -122,19 +108,19 @@ export default function useCluster() { const doGetCluster = (clusterId) => { setClusterDetailLoading(true) - axios({ - method: "GET", - url: `/api/cassandra/cluster/${clusterId}`, - params: {} - }).then((response) => { - const result = response.data.result.cluster; + clusterDetailApi({ + clusterId: clusterId + }).then((data) => { + if (!data.ok) { + return; + } + + const result = data.result.cluster; const clusterAuthCredentials = !!(result.username && result.password); setClusterInfo({ ...result, clusterAuthCredentials: clusterAuthCredentials }) - }).catch((error) => { - errorCatch(error) }).finally(() => { setClusterDetailLoading(false) }); diff --git a/cassdio-web/src/main/webapp/src/hooks/useKeyspace.js b/cassdio-web/src/main/webapp/src/hooks/useKeyspace.js index ae8f69e1..8eec78da 100644 --- a/cassdio-web/src/main/webapp/src/hooks/useKeyspace.js +++ b/cassdio-web/src/main/webapp/src/hooks/useKeyspace.js @@ -1,28 +1,25 @@ -import axios from "axios"; - -import useCassdio from "hooks/useCassdio"; import {useState} from "react"; +import clusterKeyspaceNameListApi from "remotes/clusterKeyspaceNameListApi"; export default function useKeyspace() { - const {errorCatch} = useCassdio(); - const [keyspaceNamesLoading, setKeyspaceNamesLoading] = useState(false); const [keyspaceGeneralNames, setKeyspaceGeneralNames] = useState([]); const [keyspaceSystemNames, setKeyspaceSystemNames] = useState([]); const doGetKeyspaceNames = (clusterId, cacheEvict) => { setKeyspaceNamesLoading(true); - axios({ - method: "GET", - url: `/api/cassandra/cluster/${clusterId}/keyspace-name`, - params: { - cacheEvict: cacheEvict + clusterKeyspaceNameListApi({ + clusterId, + cacheEvict, + }).then((data) => { + if (!data.ok) { + return; } - }).then((response) => { + const userCreatedList = []; const systemCreatedList = []; - const tempKeyspaceList = response.data.result.keyspaceNameList; + const tempKeyspaceList = data.result.keyspaceNameList; for (const ele of tempKeyspaceList) { if (ele.systemKeyspace) { @@ -33,14 +30,11 @@ export default function useKeyspace() { } setKeyspaceGeneralNames(userCreatedList); setKeyspaceSystemNames(systemCreatedList); - }).catch((error) => { - errorCatch(error) }).finally(() => { setKeyspaceNamesLoading(false); }); } - return { doGetKeyspaceNames, keyspaceNamesLoading, diff --git a/cassdio-web/src/main/webapp/src/hooks/useTable.js b/cassdio-web/src/main/webapp/src/hooks/useTable.js index 8b1835db..4529757b 100644 --- a/cassdio-web/src/main/webapp/src/hooks/useTable.js +++ b/cassdio-web/src/main/webapp/src/hooks/useTable.js @@ -1,14 +1,14 @@ -import axios from "axios"; import {toast} from "react-toastify"; import {useNavigate, useParams} from "react-router-dom"; import {useState} from "react"; -import useCassdio from "hooks/useCassdio"; import {CassdioUtils} from "utils/cassdioUtils"; +import clusterTableTruncateApi from "../remotes/clusterTableTruncateApi"; +import clusterTableDropApi from "../remotes/clusterTableDropApi"; +import clusterTableRowApi from "../remotes/clusterTableRowApi"; export default function useTable() { const navigate = useNavigate(); const routeParams = useParams(); - const {errorCatch} = useCassdio(); const [queryLoading, setQueryLoading] = useState(false) @@ -18,15 +18,18 @@ export default function useTable() { } //TODO : progressbar - axios({ - method: "DELETE", - url: `/api/cassandra/cluster/${routeParams.clusterId}/keyspace/${routeParams.keyspaceName}/table/${routeParams.tableName}/truncate`, - params: {}, - }).then((response) => { + clusterTableTruncateApi({ + clusterId: routeParams.clusterId, + keyspaceName: routeParams.keyspaceName, + tableName: routeParams.tableName, + }).then((data) => { + if (!data.ok) { + return; + } + toast.info("complete") - doGetTableList(null); - }).catch((error) => { - errorCatch(error); + doGetTableRows(null); + }).finally(() => { }) } @@ -37,15 +40,17 @@ export default function useTable() { //TODO : progressbar - axios({ - method: "DELETE", - url: `/api/cassandra/cluster/${routeParams.clusterId}/keyspace/${routeParams.keyspaceName}/table/${routeParams.tableName}`, - params: {}, - }).then((response) => { + clusterTableDropApi({ + clusterId: routeParams.clusterId, + keyspaceName: routeParams.keyspaceName, + tableName: routeParams.tableName, + }).then((data) => { + if (!data.ok) { + return; + } + toast.info("complete") navigate(`/cluster/${routeParams.clusterId}/keyspace/${routeParams.keyspaceName}`) - }).catch((error) => { - errorCatch(error); }).finally(() => { }) } @@ -61,7 +66,7 @@ export default function useTable() { const [queryResult, setQueryResult] = useState(initQueryResult) const [nextCursor, setNextCursor] = useState('') - const doGetTableList = (cursor, setLoading) => { + const doGetTableRows = (cursor, setLoading) => { if (cursor === null) { setQueryResult(initQueryResult) } @@ -71,25 +76,20 @@ export default function useTable() { setLoading(true) } - axios({ - method: "GET", - url: `/api/cassandra/cluster/${routeParams.clusterId}/keyspace/${routeParams.keyspaceName}/table/${routeParams.tableName}/row`, - params: { - pageSize: 50, - timeoutSeconds: 3, - cursor: cursor, - }, - }).then((response) => { - setNextCursor(response.data.result.nextCursor) + clusterTableRowApi({ + clusterId: routeParams.clusterId, + keyspaceName: routeParams.keyspaceName, + tableName: routeParams.tableName, + cursor: cursor, + }).then((data) => { + setNextCursor(data.result.nextCursor) setQueryResult({ - rows: [...queryResult.rows, ...response.data.result.rows], - rowHeader: response.data.result.rowHeader, - columnList: response.data.result.columnList, - convertedRowHeader: CassdioUtils.convertRowHeader(response.data.result.columnList, response.data.result.rowHeader), + rows: [...queryResult.rows, ...data.result.rows], + rowHeader: data.result.rowHeader, + columnList: data.result.columnList, + convertedRowHeader: CassdioUtils.convertRowHeader(data.result.columnList, data.result.rowHeader), }) - }).catch((error) => { - errorCatch(error); }).finally(() => { if (!setLoading) { setQueryLoading(false); @@ -102,7 +102,7 @@ export default function useTable() { return { doTableTruncate, doTableDrop, - doGetTableList, + doGetTableRows, queryLoading, queryResult, nextCursor diff --git a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-client-page.js b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-client-page.js index e15cd130..4009b96b 100644 --- a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-client-page.js +++ b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-client-page.js @@ -1,28 +1,29 @@ import {useParams} from "react-router-dom"; -import useCassdio from "../../hooks/useCassdio"; import {useEffect, useState} from "react"; -import axios from "axios"; -import Spinner from "../../components/common/spinner"; -import ClusterMonitoringNavLink from "../../components/cluster/cluster-monitoring-nav-link"; +import Spinner from "components/common/spinner"; +import ClusterMonitoringNavLink from "components/cluster/cluster-monitoring-nav-link"; +import clusterClientApi from "remotes/clusterClientApi"; const ClusterClientPage = () => { const routeParams = useParams(); - const {errorCatch} = useCassdio(); const [loading, setLoading] = useState(false); const [clients, setClients] = useState([]); const [groupedClients, setGroupedClients] = useState([]) - useEffect(() => { + const pageInit = () => { setLoading(true) - axios({ - method: "GET", - url: `/api/cassandra/cluster/${routeParams.clusterId}/client`, - }).then((response) => { - setClients(response.data.result.clients) + clusterClientApi({ + clusterId: routeParams.clusterId + }).then((data) => { + if (!data.ok) { + return; + } + + setClients(data.result.clients) - const groupedClients = response.data.result.clients.reduce((acc, client) => { + const groupedClients = data.result.clients.reduce((acc, client) => { if (!acc[client.address]) { acc[client.address] = { address: client.address, @@ -39,17 +40,19 @@ const ClusterClientPage = () => { .sort(([, a], [, b]) => b.connectionCount - a.connectionCount) .flatMap(([address, data]) => [address, data]); setGroupedClients(groupedClientsArray); - }).catch((error) => { - errorCatch(error) }).finally(() => { setLoading(false) }); + } + + useEffect(() => { + + pageInit(); return () => { }; }, [routeParams.clusterId]); - return ( <> @@ -115,7 +118,7 @@ const ClusterClientPage = () => { {client.username} - {client.driverVersion || '-' } + {client.driverVersion || '-'} {client.requestCount} diff --git a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-dashboard-page.js b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-dashboard-page.js index 1bf3c491..50e1c88e 100644 --- a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-dashboard-page.js +++ b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-dashboard-page.js @@ -2,37 +2,36 @@ import {Link, useParams} from "react-router-dom"; import {useEffect, useState} from "react"; import ClusterKeyspaceBreadcrumb from "components/cluster/cluster-keyspace-breadcrumb"; import Spinner from "components/common/spinner"; -import axios from "axios"; -import useCassdio from "hooks/useCassdio"; +import clusterKeyspaceListApi from "remotes/clusterKeyspaceListApi"; const ClusterDashboardPage = ({}) => { const routeParams = useParams(); const [clusterId, setClusterId] = useState(``) - const {errorCatch} = useCassdio(); const [keyspaceList, setKeyspaceList] = useState([]); const [keyspaceLoading, setKeyspaceLoading] = useState(false); + const getKeyspaceList = () => { + clusterKeyspaceListApi({ + clusterId: routeParams.clusterId, + }).then((data) => { + if (!data.ok) { + return; + } + + setKeyspaceList(data.result.keyspaceList); + }).finally(() => { + setKeyspaceLoading(false) + }); + } + useEffect(() => { //show component setClusterId(routeParams.clusterId); - setKeyspaceLoading(true) - //TODO: 모듈화 해야함. - axios({ - method: "GET", - url: `/api/cassandra/cluster/${routeParams.clusterId}/keyspace`, - params: {} - }).then((response) => { - setKeyspaceList(response.data.result.keyspaceList); - - }).catch((error) => { - errorCatch(error) - }).finally(() => { - setKeyspaceLoading(false) - }); + getKeyspaceList(); return () => { //hide component diff --git a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-comapction-page.js b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-comapction-page.js index f0f9bf00..cf9386e7 100644 --- a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-comapction-page.js +++ b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-comapction-page.js @@ -1,35 +1,35 @@ import {Link, useParams} from "react-router-dom"; -import useCassdio from "../../hooks/useCassdio"; import {useEffect, useState} from "react"; -import axios from "axios"; import ClusterKeyspaceBreadcrumb from "../../components/cluster/cluster-keyspace-breadcrumb"; import Spinner from "../../components/common/spinner"; import {ByteFormatUtils} from "../../utils/byteFormat"; +import clusterCompactionHistoryApi from "../../remotes/clusterCompactionHistoryApi"; const ClusterKeyspaceCompactionPage = () => { const routeParams = useParams(); - const {errorCatch} = useCassdio(); const [loading, setLoading] = useState(false); const [histories, setHistories] = useState([]); - useEffect(() => { - console.log(routeParams.keyspaceName) - setLoading(true) - axios({ - method: "GET", - url: `/api/cassandra/cluster/${routeParams.clusterId}/compaction-history`, - params: { - keyspace: routeParams.keyspaceName + const clusterCompactionHistory = () => { + clusterCompactionHistoryApi({ + clusterId: routeParams.clusterId, + keyspaceName: routeParams.keyspaceName, + }).then((data) => { + if (!data.ok) { + return; } - }).then((response) => { - setHistories(response.data.result.histories) - }).catch((error) => { - errorCatch(error) + + setHistories(data.result.histories) }).finally(() => { setLoading(false) }); + } + + useEffect(() => { + setLoading(true) + clusterCompactionHistory(); return () => { }; @@ -68,14 +68,16 @@ const ClusterKeyspaceCompactionPage = () => { return ( - + {compaction.keyspaceName} - + {compaction.columnFamilyName} diff --git a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-page.js b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-page.js index e228b622..a271ff28 100644 --- a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-page.js +++ b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-page.js @@ -1,17 +1,15 @@ -import {Link, useParams} from "react-router-dom"; -import useCassdio from "../../hooks/useCassdio"; import React, {useEffect, useState} from "react"; -import axios from "axios"; -import ClusterKeyspaceBreadcrumb from "../../components/cluster/cluster-keyspace-breadcrumb"; -import Spinner from "../../components/common/spinner"; -import {CassdioUtils} from "../../utils/cassdioUtils"; -import KeyspaceTableList from "../../components/cluster/keyspace-table-list"; +import {Link, useParams} from "react-router-dom"; -const ClusterKeyspacePage = () => { +import ClusterKeyspaceBreadcrumb from "components/cluster/cluster-keyspace-breadcrumb"; +import Spinner from "components/common/spinner"; +import {CassdioUtils} from "utils/cassdioUtils"; +import KeyspaceTableList from "components/cluster/keyspace-table-list"; +import clusterKeyspaceDetailApi from "remotes/clusterKeyspaceDetailApi"; +const ClusterKeyspacePage = () => { const routeParams = useParams(); - const {errorCatch} = useCassdio(); const [detailLoading, setDetailLoading] = useState(false); const [keyspaceDescribe, setKeyspaceDescribe] = useState(''); @@ -21,27 +19,31 @@ const ClusterKeyspacePage = () => { }); const [tableList, setTableList] = useState({}); - useEffect(() => { - //show component - setKeyspaceDescribe(''); + const getKeyspaceDetail = () => { setDetailLoading(true) - axios({ - method: "GET", - url: `/api/cassandra/cluster/${routeParams.clusterId}/keyspace/${routeParams.keyspaceName}`, - params: { - withTableList: true, + clusterKeyspaceDetailApi({ + clusterId: routeParams.clusterId, + keyspaceName: routeParams.keyspaceName, + withTableList: true, + }).then((data) => { + if (!data.ok) { + return; } - }).then((response) => { - setKeyspaceDescribe(response.data.result.describe) - setKeyspaceDetail(response.data.result.detail); - setTableList(response.data.result.tableList) + setKeyspaceDescribe(data.result.describe) + setKeyspaceDetail(data.result.detail); + + setTableList(data.result.tableList) - }).catch((error) => { - errorCatch(error) }).finally(() => { setDetailLoading(false) }); + } + + useEffect(() => { + //show component + setKeyspaceDescribe(''); + getKeyspaceDetail(); return () => { //hide component @@ -66,7 +68,7 @@ const ClusterKeyspacePage = () => {
    + to={`/cluster/${routeParams.clusterId}/keyspace/${routeParams.keyspaceName}/query`}> Query {/**/} diff --git a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-metrics-page.js b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-metrics-page.js index 8940926e..03046cfd 100644 --- a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-metrics-page.js +++ b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-metrics-page.js @@ -1,4 +1,4 @@ -import ClusterMonitoringNavLink from "../../components/cluster/cluster-monitoring-nav-link"; +import ClusterMonitoringNavLink from "components/cluster/cluster-monitoring-nav-link"; const ClusterMetricsPage = () => { return ( diff --git a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-nodes-page.js b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-nodes-page.js index 427accf7..734f8b90 100644 --- a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-nodes-page.js +++ b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-nodes-page.js @@ -1,15 +1,16 @@ -import {Link, useParams} from "react-router-dom"; -import useCassdio from "../../hooks/useCassdio"; import {useEffect, useState} from "react"; -import axios from "axios"; -import Spinner from "../../components/common/spinner"; -import {DateUtils} from "../../utils/timeUtils"; -import ClusterMonitoringNavLink from "../../components/cluster/cluster-monitoring-nav-link"; +import {useParams} from "react-router-dom"; + +import Spinner from "components/common/spinner"; + +import ClusterMonitoringNavLink from "components/cluster/cluster-monitoring-nav-link"; + +import clusterNodesApi from "remotes/clusterNodesApi"; +import {DateUtils} from "utils/timeUtils"; const ClusterNodesPage = ({}) => { const routeParams = useParams(); - const {errorCatch} = useCassdio(); const [nodeLoading, setNodeLoading] = useState(false); const [nodeList, setNodeList] = useState([]); @@ -42,16 +43,17 @@ const ClusterNodesPage = ({}) => { function getNodes(clusterId) { setNodeLoading(true) - axios({ - method: "GET", - url: `/api/cassandra/cluster/${clusterId}/node`, - }).then((response) => { - const nodes = response.data.result.items + clusterNodesApi({ + clusterId + }).then((data) => { + if (!data.ok) { + return; + } + + const nodes = data.result.items setNodeList(nodes) setTotalNodeSize(nodes.length) setAvailableNodeSize(nodes.filter(node => node.nodeState === 'UP' || node.nodeState === 'UNKNOWN').length) - }).catch((error) => { - errorCatch(error); }).finally(() => { setNodeLoading(false) }); diff --git a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-query-page.js b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-query-page.js index 2d115fd8..4a182b2d 100644 --- a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-query-page.js +++ b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-query-page.js @@ -1,18 +1,16 @@ import {useParams} from "react-router-dom"; -import useCassdio from "hooks/useCassdio"; import React, {useEffect, useState} from "react"; import {toast} from "react-toastify"; import QueryEditor from "components/cluster/query-editor"; import QueryResult from "components/cluster/query-result"; import QueryTraceViewModal from "components/cluster/modal/query-trace-view-modal"; import ClusterKeyspaceBreadcrumb from "components/cluster/cluster-keyspace-breadcrumb"; -import {useCassdioState} from "../../context/cassdioContext"; +import {useCassdioState} from "context/cassdioContext"; import clusterQueryApi from "remotes/clusterQueryApi"; const ClusterQueryPage = () => { const routeParams = useParams(); - const {errorCatch} = useCassdio(); const [showQueryTrace, setShowQueryTrace] = useState(false); const { @@ -60,27 +58,29 @@ const ClusterQueryPage = () => { query: query, cursor: cursor, queryOptions: queryOptions, - }).then((response) => { + }).then((data) => { + if (!data.ok) { + return; + } + setQueryParam({ query: query, - nextCursor: response.data.result.nextCursor + nextCursor: data.result.nextCursor }) let rows = []; if (!cursor) { - rows = response.data.result.rows; + rows = data.result.rows; } else { - rows = [...queryResult.rows, ...response.data.result.rows]; + rows = [...queryResult.rows, ...data.result.rows]; } setQueryResult({ - wasApplied: response.data.result.wasApplied, + wasApplied: data.result.wasApplied, rows: rows, - rowHeader: response.data.result.rowHeader, - queryTrace: response.data.result.queryTrace, + rowHeader: data.result.rowHeader, + queryTrace: data.result.queryTrace, }) - }).catch((error) => { - errorCatch(error); }).finally(() => { setLoading(false); }) diff --git a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-table-page.js b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-table-page.js index 78d26b4e..97e54525 100644 --- a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-table-page.js +++ b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-table-page.js @@ -1,21 +1,23 @@ -import useTable from "../../hooks/useTable"; -import {useParams} from "react-router-dom"; import {useEffect, useState} from "react"; -import ClusterKeyspaceBreadcrumb from "../../components/cluster/cluster-keyspace-breadcrumb"; +import {useParams} from "react-router-dom"; import {OverlayTrigger, Tooltip} from "react-bootstrap"; -import DataRowItem from "../../components/cluster/data-row-item"; -import TableDetailModal from "../../components/cluster/modal/table-detail-modal"; -import TableDataManageModal from "../../components/cluster/modal/table-data-manage-modal"; -import TableExportModal from "../../components/cluster/modal/table-export-modal"; -import TableImportModal from "../../components/cluster/modal/table-import-modal"; -import TableRowDetailModal from "../../components/cluster/modal/table-row-detail-modal"; + +import useTable from "hooks/useTable"; + +import ClusterKeyspaceBreadcrumb from "components/cluster/cluster-keyspace-breadcrumb"; + +import DataRowItem from "components/cluster/data-row-item"; +import TableDetailModal from "components/cluster/modal/table-detail-modal"; +import TableExportModal from "components/cluster/modal/table-export-modal"; +import TableImportModal from "components/cluster/modal/table-import-modal"; +import TableRowDetailModal from "components/cluster/modal/table-row-detail-modal"; const ClusterTablePage = () => { const { doTableTruncate, doTableDrop, - doGetTableList, + doGetTableRows, queryLoading, queryResult, nextCursor, @@ -25,7 +27,6 @@ const ClusterTablePage = () => { const [showDetail, setShowDetail] = useState(false); const [showExport, setShowExport] = useState(false); const [showImport, setShowImport] = useState(false); - const [showDataManage, setShowDataManage] = useState(false); const [showRowDetail, setShowRowDetail] = useState(false); const [tableName, setTableName] = useState(''); const [moreQueryLoading, setMoreQueryLoading] = useState(false) @@ -35,7 +36,7 @@ const ClusterTablePage = () => { //show component setTableName(routeParams.tableName); - doGetTableList(null) + doGetTableRows(null) return () => { //hide component @@ -201,7 +202,7 @@ const ClusterTablePage = () => {
    diff --git a/cassdio-web/src/main/webapp/src/components/cluster/keyspace-table-list.js b/cassdio-web/src/main/webapp/src/components/cluster/keyspace-table-list.js index 26a46e7f..7ca413f9 100644 --- a/cassdio-web/src/main/webapp/src/components/cluster/keyspace-table-list.js +++ b/cassdio-web/src/main/webapp/src/components/cluster/keyspace-table-list.js @@ -1,6 +1,6 @@ import {Link} from "react-router-dom"; import TableDetailModal from "./modal/table-detail-modal"; -import {useEffect, useState} from "react"; +import React, {useEffect, useState} from "react"; import clusterTableListApi from "remotes/clusterTableListApi"; const KeyspaceTableList = ({clusterId, keyspaceName, tableList}) => { @@ -59,7 +59,7 @@ const KeyspaceTableList = ({clusterId, keyspaceName, tableList}) => { - {info.table_name} + {info.table_name}
    {info.comment} diff --git a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-comapction-page.js b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-comapction-page.js index cf9386e7..49fc7f66 100644 --- a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-comapction-page.js +++ b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-comapction-page.js @@ -1,5 +1,5 @@ import {Link, useParams} from "react-router-dom"; -import {useEffect, useState} from "react"; +import React, {useEffect, useState} from "react"; import ClusterKeyspaceBreadcrumb from "../../components/cluster/cluster-keyspace-breadcrumb"; import Spinner from "../../components/common/spinner"; import {ByteFormatUtils} from "../../utils/byteFormat"; @@ -40,7 +40,12 @@ const ClusterKeyspaceCompactionPage = () => { + active={"KEYSPACE_MONITORING"} + > +
  • + Monitoring +
  • +
    diff --git a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-page.js b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-page.js index a271ff28..cceb4903 100644 --- a/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-page.js +++ b/cassdio-web/src/main/webapp/src/pages/cluster/cluster-keyspace-page.js @@ -11,6 +11,7 @@ const ClusterKeyspacePage = () => { const routeParams = useParams(); + const [queryEditorSupport, setQueryEditorSupport] = useState(false); const [detailLoading, setDetailLoading] = useState(false); const [keyspaceDescribe, setKeyspaceDescribe] = useState(''); const [keyspaceDetail, setKeyspaceDetail] = useState({ @@ -32,7 +33,7 @@ const ClusterKeyspacePage = () => { setKeyspaceDescribe(data.result.describe) setKeyspaceDetail(data.result.detail); - + setQueryEditorSupport(data.result.queryEditorSupport); setTableList(data.result.tableList) }).finally(() => { @@ -67,10 +68,14 @@ const ClusterKeyspacePage = () => {
    - - Query - + { + queryEditorSupport && + + Query + + } + {/**/}
    {/*