diff --git a/scaleph-api/src/main/java/cn/sliew/scaleph/api/controller/ws/WsDorisOperatorInstanceController.java b/scaleph-api/src/main/java/cn/sliew/scaleph/api/controller/ws/WsDorisOperatorInstanceController.java index d52b7d6d8..4576543d9 100644 --- a/scaleph-api/src/main/java/cn/sliew/scaleph/api/controller/ws/WsDorisOperatorInstanceController.java +++ b/scaleph-api/src/main/java/cn/sliew/scaleph/api/controller/ws/WsDorisOperatorInstanceController.java @@ -27,6 +27,7 @@ import cn.sliew.scaleph.engine.doris.service.param.WsDorisOperatorInstanceUpdateParam; import cn.sliew.scaleph.system.model.ResponseVO; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; @@ -36,6 +37,7 @@ import javax.validation.Valid; import java.util.List; +import java.util.Optional; @Tag(name = "Doris管理-Operator实例管理") @RestController @@ -125,4 +127,12 @@ public ResponseEntity shutdown(@PathVariable("id") Long id) { return new ResponseEntity<>(ResponseVO.success(), HttpStatus.OK); } + @Logging + @GetMapping("status/{id}") + @Operation(summary = "获取实例状态", description = "获取实例状态") + public ResponseEntity> getStatus(@PathVariable("id") Long id) { + Optional sessionCluster = wsDorisInstanceService.getStatusWithoutManagedFields(id); + return new ResponseEntity<>(ResponseVO.success(sessionCluster.orElse(null)), HttpStatus.OK); + } + } diff --git a/scaleph-engine/scaleph-engine-doris/src/main/java/cn/sliew/scaleph/engine/doris/action/DorisOperatorInstanceStatusSyncJob.java b/scaleph-engine/scaleph-engine-doris/src/main/java/cn/sliew/scaleph/engine/doris/action/DorisOperatorInstanceStatusSyncJob.java index 67cafd893..8fb9fddd6 100644 --- a/scaleph-engine/scaleph-engine-doris/src/main/java/cn/sliew/scaleph/engine/doris/action/DorisOperatorInstanceStatusSyncJob.java +++ b/scaleph-engine/scaleph-engine-doris/src/main/java/cn/sliew/scaleph/engine/doris/action/DorisOperatorInstanceStatusSyncJob.java @@ -21,9 +21,7 @@ import cn.sliew.milky.common.filter.ActionListener; import cn.sliew.milky.common.util.JacksonUtil; import cn.sliew.scaleph.engine.doris.operator.status.DorisClusterStatus; -import cn.sliew.scaleph.engine.doris.service.DorisOperatorService; import cn.sliew.scaleph.engine.doris.service.WsDorisOperatorInstanceService; -import cn.sliew.scaleph.engine.doris.service.dto.WsDorisOperatorInstanceDTO; import cn.sliew.scaleph.workflow.engine.action.ActionContext; import cn.sliew.scaleph.workflow.engine.action.ActionResult; import cn.sliew.scaleph.workflow.engine.workflow.AbstractWorkFlow; @@ -41,8 +39,6 @@ public class DorisOperatorInstanceStatusSyncJob extends AbstractWorkFlow { @Autowired private WsDorisOperatorInstanceService wsDorisOperatorInstanceService; - @Autowired - private DorisOperatorService dorisOperatorService; public DorisOperatorInstanceStatusSyncJob() { super("DORIS_OPERATOR_INSTANCE_STATUS_SYNC_JOB"); @@ -61,8 +57,7 @@ private void process() { private void doProcess(Long id) { try { - WsDorisOperatorInstanceDTO instanceDTO = wsDorisOperatorInstanceService.selectOne(id); - Optional optional = dorisOperatorService.get(instanceDTO); + Optional optional = wsDorisOperatorInstanceService.getStatusWithoutManagedFields(id); if (optional.isPresent()) { String json = JacksonUtil.toJsonString(optional.get().get("status")); DorisClusterStatus status = JacksonUtil.parseJsonString(json, DorisClusterStatus.class); diff --git a/scaleph-engine/scaleph-engine-doris/src/main/java/cn/sliew/scaleph/engine/doris/service/WsDorisOperatorInstanceService.java b/scaleph-engine/scaleph-engine-doris/src/main/java/cn/sliew/scaleph/engine/doris/service/WsDorisOperatorInstanceService.java index 028f512a2..565034eff 100644 --- a/scaleph-engine/scaleph-engine-doris/src/main/java/cn/sliew/scaleph/engine/doris/service/WsDorisOperatorInstanceService.java +++ b/scaleph-engine/scaleph-engine-doris/src/main/java/cn/sliew/scaleph/engine/doris/service/WsDorisOperatorInstanceService.java @@ -25,8 +25,10 @@ import cn.sliew.scaleph.engine.doris.service.param.WsDorisOperatorInstanceListParam; import cn.sliew.scaleph.engine.doris.service.param.WsDorisOperatorInstanceUpdateParam; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import java.util.List; +import java.util.Optional; public interface WsDorisOperatorInstanceService { @@ -54,6 +56,10 @@ public interface WsDorisOperatorInstanceService { void shutdown(Long id); + Optional getStatus(Long id); + + Optional getStatusWithoutManagedFields(Long id); + int updateStatus(Long id, DorisClusterStatus status); int clearStatus(Long id); diff --git a/scaleph-engine/scaleph-engine-doris/src/main/java/cn/sliew/scaleph/engine/doris/service/impl/WsDorisOperatorInstanceServiceImpl.java b/scaleph-engine/scaleph-engine-doris/src/main/java/cn/sliew/scaleph/engine/doris/service/impl/WsDorisOperatorInstanceServiceImpl.java index d370b1a5a..d6293dbb4 100644 --- a/scaleph-engine/scaleph-engine-doris/src/main/java/cn/sliew/scaleph/engine/doris/service/impl/WsDorisOperatorInstanceServiceImpl.java +++ b/scaleph-engine/scaleph-engine-doris/src/main/java/cn/sliew/scaleph/engine/doris/service/impl/WsDorisOperatorInstanceServiceImpl.java @@ -18,6 +18,7 @@ package cn.sliew.scaleph.engine.doris.service.impl; +import cn.sliew.milky.common.exception.Rethrower; import cn.sliew.milky.common.util.JacksonUtil; import cn.sliew.scaleph.common.dict.common.YesOrNo; import cn.sliew.scaleph.common.util.UUIDUtil; @@ -38,14 +39,19 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; +import io.fabric8.kubernetes.api.model.GenericKubernetesResourceBuilder; +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.client.utils.Serialization; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.util.Predicates; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import static cn.sliew.milky.common.check.Ensures.checkState; @@ -203,6 +209,34 @@ public void shutdown(Long id) { wsDorisOperatorInstanceMapper.updateById(record); } + @Override + public Optional getStatus(Long id) { + try { + WsDorisOperatorInstanceDTO instanceDTO = selectOne(id); + if (instanceDTO.getDeployed() == YesOrNo.YES) { + return dorisOperatorService.get(instanceDTO); + } + return Optional.empty(); + } catch (Exception e) { + Rethrower.throwAs(e); + return null; + } + } + + @Override + public Optional getStatusWithoutManagedFields(Long id) { + Optional optional = getStatus(id); + if (optional.isEmpty()) { + return Optional.empty(); + } + GenericKubernetesResource status = optional.get(); + GenericKubernetesResourceBuilder builder = new GenericKubernetesResourceBuilder(status); + ObjectMetaBuilder objectMetaBuilder = new ObjectMetaBuilder(status.getMetadata()); + objectMetaBuilder.removeMatchingFromManagedFields(Predicates.isTrue()); + builder.withMetadata(objectMetaBuilder.build()); + return Optional.of(builder.build()); + } + @Override public int updateStatus(Long id, DorisClusterStatus status) { if (status == null) { diff --git a/scaleph-ui-react/public/images/DataSource/Cassandra.png b/scaleph-ui-react/public/images/DataSource/Cassandra.png new file mode 100644 index 000000000..b51b2cdbd Binary files /dev/null and b/scaleph-ui-react/public/images/DataSource/Cassandra.png differ diff --git a/scaleph-ui-react/public/images/DataSource/Cassandra.svg b/scaleph-ui-react/public/images/DataSource/Cassandra.svg deleted file mode 100644 index 5510e9f2d..000000000 --- a/scaleph-ui-react/public/images/DataSource/Cassandra.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/scaleph-ui-react/public/images/DataSource/Elasticsearch.png b/scaleph-ui-react/public/images/DataSource/Elasticsearch.png index 420a44eef..61e8c1590 100644 Binary files a/scaleph-ui-react/public/images/DataSource/Elasticsearch.png and b/scaleph-ui-react/public/images/DataSource/Elasticsearch.png differ diff --git a/scaleph-ui-react/public/images/DataSource/HBase.png b/scaleph-ui-react/public/images/DataSource/HBase.png index e91eb8d74..eada91787 100644 Binary files a/scaleph-ui-react/public/images/DataSource/HBase.png and b/scaleph-ui-react/public/images/DataSource/HBase.png differ diff --git a/scaleph-ui-react/public/images/DataSource/HDFS.png b/scaleph-ui-react/public/images/DataSource/HDFS.png index 964760234..720b762fd 100644 Binary files a/scaleph-ui-react/public/images/DataSource/HDFS.png and b/scaleph-ui-react/public/images/DataSource/HDFS.png differ diff --git a/scaleph-ui-react/public/images/DataSource/HDFS.svg b/scaleph-ui-react/public/images/DataSource/HDFS.svg deleted file mode 100644 index 9726a53ec..000000000 --- a/scaleph-ui-react/public/images/DataSource/HDFS.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/scaleph-ui-react/public/images/DataSource/Hive.png b/scaleph-ui-react/public/images/DataSource/Hive.png index c869645b5..93d5d32dd 100644 Binary files a/scaleph-ui-react/public/images/DataSource/Hive.png and b/scaleph-ui-react/public/images/DataSource/Hive.png differ diff --git a/scaleph-ui-react/public/images/DataSource/Hive.svg b/scaleph-ui-react/public/images/DataSource/Hive.svg deleted file mode 100644 index 031ad3897..000000000 --- a/scaleph-ui-react/public/images/DataSource/Hive.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scaleph-ui-react/public/images/DataSource/Kafka.png b/scaleph-ui-react/public/images/DataSource/Kafka.png index 67b3a378a..6510985ff 100644 Binary files a/scaleph-ui-react/public/images/DataSource/Kafka.png and b/scaleph-ui-react/public/images/DataSource/Kafka.png differ diff --git a/scaleph-ui-react/public/images/DataSource/Kafka.svg b/scaleph-ui-react/public/images/DataSource/Kafka.svg deleted file mode 100644 index f8649270b..000000000 --- a/scaleph-ui-react/public/images/DataSource/Kafka.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/scaleph-ui-react/public/images/DataSource/MongoDB.png b/scaleph-ui-react/public/images/DataSource/MongoDB.png index 67ab04fae..90c90158e 100644 Binary files a/scaleph-ui-react/public/images/DataSource/MongoDB.png and b/scaleph-ui-react/public/images/DataSource/MongoDB.png differ diff --git a/scaleph-ui-react/public/images/DataSource/MongoDB.svg b/scaleph-ui-react/public/images/DataSource/MongoDB.svg deleted file mode 100644 index e7e4141d7..000000000 --- a/scaleph-ui-react/public/images/DataSource/MongoDB.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/scaleph-ui-react/public/images/DataSource/MySQL.png b/scaleph-ui-react/public/images/DataSource/MySQL.png index c6d96a913..68d2adedd 100644 Binary files a/scaleph-ui-react/public/images/DataSource/MySQL.png and b/scaleph-ui-react/public/images/DataSource/MySQL.png differ diff --git a/scaleph-ui-react/public/images/DataSource/Oracle.png b/scaleph-ui-react/public/images/DataSource/Oracle.png index 9edd47869..ae25e6f71 100644 Binary files a/scaleph-ui-react/public/images/DataSource/Oracle.png and b/scaleph-ui-react/public/images/DataSource/Oracle.png differ diff --git a/scaleph-ui-react/public/images/DataSource/Oracle.svg b/scaleph-ui-react/public/images/DataSource/Oracle.svg deleted file mode 100644 index 40e01a296..000000000 --- a/scaleph-ui-react/public/images/DataSource/Oracle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/scaleph-ui-react/public/images/DataSource/PostgreSQL.png b/scaleph-ui-react/public/images/DataSource/PostgreSQL.png index 1dc8d9963..c4e1ac272 100644 Binary files a/scaleph-ui-react/public/images/DataSource/PostgreSQL.png and b/scaleph-ui-react/public/images/DataSource/PostgreSQL.png differ diff --git a/scaleph-ui-react/public/images/DataSource/PostgreSQL.svg b/scaleph-ui-react/public/images/DataSource/PostgreSQL.svg deleted file mode 100644 index 98fff4b8c..000000000 --- a/scaleph-ui-react/public/images/DataSource/PostgreSQL.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/scaleph-ui-react/public/images/DataSource/Pulsar.png b/scaleph-ui-react/public/images/DataSource/Pulsar.png new file mode 100644 index 000000000..9cc6aeaa0 Binary files /dev/null and b/scaleph-ui-react/public/images/DataSource/Pulsar.png differ diff --git a/scaleph-ui-react/public/images/DataSource/Pulsar.svg b/scaleph-ui-react/public/images/DataSource/Pulsar.svg deleted file mode 100644 index 04487852a..000000000 --- a/scaleph-ui-react/public/images/DataSource/Pulsar.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/scaleph-ui-react/public/images/DataSource/Redis.png b/scaleph-ui-react/public/images/DataSource/Redis.png index 1e606cd6f..0afb57fd8 100644 Binary files a/scaleph-ui-react/public/images/DataSource/Redis.png and b/scaleph-ui-react/public/images/DataSource/Redis.png differ diff --git a/scaleph-ui-react/public/images/DataSource/Redis.svg b/scaleph-ui-react/public/images/DataSource/Redis.svg deleted file mode 100644 index 9208c5667..000000000 --- a/scaleph-ui-react/public/images/DataSource/Redis.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/scaleph-ui-react/src/constants/enum.ts b/scaleph-ui-react/src/constants/enum.ts index 7ebfb8a37..2ea214340 100644 --- a/scaleph-ui-react/src/constants/enum.ts +++ b/scaleph-ui-react/src/constants/enum.ts @@ -71,3 +71,8 @@ export enum DeploymentKind { Deployment = 'FlinkDeployment', SessionCluster = 'FlinkSessionJob' } + +export enum YesOrNo { + YES = '1', + NO = '0' +} diff --git a/scaleph-ui-react/src/locales/zh-CN/pages/project.ts b/scaleph-ui-react/src/locales/zh-CN/pages/project.ts index 06502d92f..033c58c22 100644 --- a/scaleph-ui-react/src/locales/zh-CN/pages/project.ts +++ b/scaleph-ui-react/src/locales/zh-CN/pages/project.ts @@ -953,6 +953,7 @@ export default { 'pages.project.doris.instance': 'Instance', 'pages.project.doris.instance.name': '名称', 'pages.project.doris.instance.namespace': '命名空间', + 'pages.project.doris.instance.instanceId': '实例ID', 'pages.project.doris.instance.namespace.tooltip': '填写 Kubernetes Namespace', 'pages.project.doris.instance.deployed': '是否部署?', 'pages.project.doris.instance.steps': '创建实例', @@ -974,7 +975,9 @@ export default { 'pages.project.doris.instance.detail.component.cn': '计算节点', 'pages.project.doris.instance.detail.component.broker': 'Broker节点', 'pages.project.doris.instance.detail.access': '连接信息', - 'pages.project.doris.instance.detail.yaml': 'YAML', + 'pages.project.doris.instance.detail.yaml': '实例&状态', + 'pages.project.doris.instance.detail.yaml.instance': '实例', + 'pages.project.doris.instance.detail.yaml.status': '状态', 'pages.project.doris.instance.detail.deploy': 'Deploy', 'pages.project.doris.instance.detail.shutdown': 'Shutdown', diff --git a/scaleph-ui-react/src/models/project/workspace/doris/instance/dorisInstanceDetail.ts b/scaleph-ui-react/src/models/project/workspace/doris/instance/dorisInstanceDetail.ts new file mode 100644 index 000000000..53603668f --- /dev/null +++ b/scaleph-ui-react/src/models/project/workspace/doris/instance/dorisInstanceDetail.ts @@ -0,0 +1,65 @@ +import {WsDorisOperatorInstance, WsDorisOperatorTemplate} from "@/services/project/typings"; +import {Effect, Reducer} from "umi"; +import YAML from "yaml"; +import {WsDorisOperatorTemplateService} from "@/services/project/WsDorisOperatorTemplateService"; +import {WsDorisOperatorInstanceService} from "@/services/project/WsDorisOperatorInstanceService"; + +export interface StateType { + instance: WsDorisOperatorInstance, + instanceYaml: string + instanceStatusYaml: string +} + +export interface ModelType { + namespace: string; + + state: StateType; + + effects: { + editInstance: Effect; + }; + + reducers: { + updateInstance: Reducer; + }; +} + +const model: ModelType = { + namespace: "dorisInstanceDetail", + + state: { + instance: null, + instanceYaml: null, + instanceStatusYaml: null + }, + + effects: { + *editInstance({payload}, {call, put}) { + const {data} = yield call(WsDorisOperatorInstanceService.selectOne, payload); + const param = {...data} + param.deployed = undefined + const response = yield call(WsDorisOperatorInstanceService.asYaml, param); + const statusReponse = yield call(WsDorisOperatorInstanceService.status, param); + yield put({type: 'updateInstance', + payload: { + instance: data, + instanceYaml: YAML.stringify(response.data), + instanceStatusYaml: YAML.stringify(statusReponse.data) + } + }); + }, + }, + + reducers: { + updateInstance(state, {payload}) { + return { + ...state, + instance: payload.instance, + instanceYaml: payload.instanceYaml, + instanceStatusYaml: payload.instanceStatusYaml, + }; + }, + }, +}; + +export default model; diff --git a/scaleph-ui-react/src/models/project/workspace/doris/instance/dorisInstanceSteps.ts b/scaleph-ui-react/src/models/project/workspace/doris/instance/dorisInstanceSteps.ts index 7646c0691..3941e9017 100644 --- a/scaleph-ui-react/src/models/project/workspace/doris/instance/dorisInstanceSteps.ts +++ b/scaleph-ui-react/src/models/project/workspace/doris/instance/dorisInstanceSteps.ts @@ -1,7 +1,6 @@ -import {WsDorisOperatorInstance, WsDorisOperatorTemplate} from "@/services/project/typings"; +import {WsDorisOperatorInstance} from "@/services/project/typings"; import {Effect, Reducer} from "umi"; import YAML from "yaml"; -import {WsDorisOperatorTemplateService} from "@/services/project/WsDorisOperatorTemplateService"; import {WsDorisOperatorInstanceService} from "@/services/project/WsDorisOperatorInstanceService"; export interface StateType { @@ -16,11 +15,11 @@ export interface ModelType { state: StateType; effects: { - queryTemplate: Effect; + editInstance: Effect; }; reducers: { - updateTemplate: Reducer; + updateInstance: Reducer; }; } @@ -37,7 +36,8 @@ const model: ModelType = { *editInstance({payload}, {call, put}) { const {data} = yield call(WsDorisOperatorInstanceService.asYaml, payload); const response = yield call(WsDorisOperatorInstanceService.asYaml, payload); - yield put({type: 'updateInstance', + yield put({ + type: 'updateInstance', payload: { instance: payload, instanceYaml: YAML.stringify(data), diff --git a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceAccess.tsx b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceAccess.tsx index 61795f603..efc6567fb 100644 --- a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceAccess.tsx +++ b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceAccess.tsx @@ -1,19 +1,60 @@ -import {useIntl} from "umi"; -import React from "react"; -import {WsDorisOperatorInstance} from "@/services/project/typings"; -import {ProCard} from "@ant-design/pro-components"; +import {connect, useIntl} from "umi"; +import React, {useState} from "react"; +import {ProCard, ProList} from "@ant-design/pro-components"; -const DorisInstanceDetailAccess: React.FC<{ data: WsDorisOperatorInstance }> = ({data}) => { +const defaultData = [ + { + id: '1', + name: 'FE地址', + content: '我是一条地址', + }, + { + id: '2', + name: 'BE地址', + content: '我是一条地址', + }, + { + id: '3', + name: 'CN地址', + content: '我是一条地址', + }, + { + id: '4', + name: 'Broker地址', + content: '我是一条地址', + }, +]; + +type DataItem = (typeof defaultData)[number]; + +const DorisInstanceDetailAccess: React.FC = (props: any) => { const intl = useIntl(); + const [dataSource, setDataSource] = useState(defaultData); + return ( - 集群连接信息,敬请期待~ + + rowKey="id" + dataSource={dataSource} + showActions="hover" + split + onDataSourceChange={setDataSource} + metas={{ + title: { + dataIndex: 'name', + }, + content: { + dataIndex: 'content', + } + }} + /> - - ); - } + + ); +} -export default DorisInstanceDetailAccess; +const mapModelToProps = ({dorisInstanceDetail}: any) => ({dorisInstanceDetail}) +export default connect(mapModelToProps)(DorisInstanceDetailAccess); diff --git a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceAction.tsx b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceAction.tsx index 5a5aca1aa..65ec692bc 100644 --- a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceAction.tsx +++ b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceAction.tsx @@ -1,23 +1,58 @@ -import {useIntl} from "umi"; +import {connect, useIntl} from "umi"; import React from "react"; -import {WsDorisOperatorInstance} from "@/services/project/typings"; -import {ProCard} from "@ant-design/pro-components"; +import {ProCard, ProDescriptions} from "@ant-design/pro-components"; import {WsDorisOperatorInstanceService} from "@/services/project/WsDorisOperatorInstanceService"; import {Button, message, Popconfirm} from "antd"; import {CaretRightOutlined, CloseOutlined} from "@ant-design/icons"; +import {YesOrNo} from "@/constants/enum"; +import {ProDescriptionsItemProps} from "@ant-design/pro-descriptions"; +import {WsFlinkKubernetesJob} from "@/services/project/typings"; -const DorisInstanceDetailAction: React.FC<{ data: WsDorisOperatorInstance }> = ({data}) => { +const DorisInstanceDetailAction: React.FC = (props: any) => { const intl = useIntl(); + const descriptionColumns: ProDescriptionsItemProps[] = [ + { + title: intl.formatMessage({id: 'pages.project.doris.instance.name'}), + key: `name`, + dataIndex: 'name', + }, + { + title: intl.formatMessage({id: 'pages.project.doris.instance.instanceId'}), + key: `instanceId`, + dataIndex: 'instanceId', + }, + { + title: intl.formatMessage({id: 'pages.project.doris.instance.namespace'}), + key: `namespace`, + dataIndex: 'namespace', + }, + { + title: intl.formatMessage({id: 'app.common.data.remark'}), + key: `remark`, + dataIndex: 'remark', + }, + { + title: intl.formatMessage({id: 'app.common.data.createTime'}), + key: `createTime`, + dataIndex: 'createTime', + }, + { + title: intl.formatMessage({id: 'app.common.data.updateTime'}), + key: `updateTime`, + dataIndex: 'updateTime', + }, + ] + return ( { - WsDorisOperatorInstanceService.deploy(data.id).then(response => { + WsDorisOperatorInstanceService.deploy(props.dorisInstanceDetail.instance?.id).then(response => { if (response.success) { message.success(intl.formatMessage({id: 'app.common.operate.submit.success'})); } @@ -27,18 +62,16 @@ const DorisInstanceDetailAction: React.FC<{ data: WsDorisOperatorInstance }> = ( - - { - WsDorisOperatorInstanceService.shutdown(data.id).then(response => { + WsDorisOperatorInstanceService.shutdown(props.dorisInstanceDetail.instance?.id).then(response => { if (response.success) { message.success(intl.formatMessage({id: 'app.common.operate.submit.success'})); } @@ -47,17 +80,22 @@ const DorisInstanceDetailAction: React.FC<{ data: WsDorisOperatorInstance }> = ( > }> - 集群信息,敬请期待~ + ); } -export default DorisInstanceDetailAction; +const mapModelToProps = ({dorisInstanceDetail}: any) => ({dorisInstanceDetail}) +export default connect(mapModelToProps)(DorisInstanceDetailAction); diff --git a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceComponent.tsx b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceComponent.tsx index bcdac3a08..494afdf7e 100644 --- a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceComponent.tsx +++ b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceComponent.tsx @@ -1,10 +1,9 @@ -import {useIntl} from "umi"; +import {connect, useIntl} from "umi"; import React from "react"; -import {WsDorisOperatorInstance} from "@/services/project/typings"; import {ProCard, StatisticCard} from "@ant-design/pro-components"; import {Divider, Space, Statistic} from "antd"; -const DorisInstanceDetailComponent: React.FC<{ data: WsDorisOperatorInstance }> = ({data}) => { +const DorisInstanceDetailComponent: React.FC = (props: any) => { const intl = useIntl(); return ( @@ -14,28 +13,28 @@ const DorisInstanceDetailComponent: React.FC<{ data: WsDorisOperatorInstance }> ) }} footer={ -
{intl.formatMessage({id: 'pages.project.doris.template.steps.component.base.image'}) + ": " + data.feSpec?.image ? data.feSpec?.image : '-'}
+
{intl.formatMessage({id: 'pages.project.doris.template.steps.component.base.image'}) + ": " + props.dorisInstanceDetail.instance?.feSpec?.image ? props.dorisInstanceDetail.instance?.feSpec?.image : '-'}
}/> @@ -43,28 +42,28 @@ const DorisInstanceDetailComponent: React.FC<{ data: WsDorisOperatorInstance }> ) }} footer={ -
{intl.formatMessage({id: 'pages.project.doris.template.steps.component.base.image'}) + ": " + data.beSpec?.image ? data.beSpec?.image : '-'}
+
{intl.formatMessage({id: 'pages.project.doris.template.steps.component.base.image'}) + ": " + props.dorisInstanceDetail.instance?.beSpec?.image ? props.dorisInstanceDetail.instance?.beSpec?.image : '-'}
}/> @@ -72,28 +71,28 @@ const DorisInstanceDetailComponent: React.FC<{ data: WsDorisOperatorInstance }> ) }} footer={ -
{intl.formatMessage({id: 'pages.project.doris.template.steps.component.base.image'}) + ": " + data.cnSpec?.image ? data.cnSpec?.image : '-'}
+
{intl.formatMessage({id: 'pages.project.doris.template.steps.component.base.image'}) + ": " + props.dorisInstanceDetail.instance?.cnSpec?.image ? props.dorisInstanceDetail.instance?.cnSpec?.image : '-'}
}/> @@ -101,32 +100,33 @@ const DorisInstanceDetailComponent: React.FC<{ data: WsDorisOperatorInstance }> ) }} footer={ -
{intl.formatMessage({id: 'pages.project.doris.template.steps.component.base.image'}) + ": " + data.brokerSpec?.image ? data.brokerSpec?.image : '-'}
+
{intl.formatMessage({id: 'pages.project.doris.template.steps.component.base.image'}) + ": " + props.dorisInstanceDetail.instance?.brokerSpec?.image ? props.dorisInstanceDetail.instance?.brokerSpec?.image : '-'}
}/> ); } -export default DorisInstanceDetailComponent; +const mapModelToProps = ({dorisInstanceDetail}: any) => ({dorisInstanceDetail}) +export default connect(mapModelToProps)(DorisInstanceDetailComponent); diff --git a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceComponentDetail.tsx b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceComponentDetail.tsx deleted file mode 100644 index f8dae5aba..000000000 --- a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceComponentDetail.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import {useIntl} from "umi"; -import React from "react"; -import {Divider} from "antd"; -import {StatisticCard} from "@ant-design/pro-components"; -import {WsDorisOperatorInstance} from "@/services/project/typings"; - -const DorisInstanceDetailComponentDetail: React.FC<{ data: WsDorisOperatorInstance }> = ({data}) => { - const intl = useIntl(); - - return ( - - - - - - - - - - ); -} - -export default DorisInstanceDetailComponentDetail; diff --git a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceYaml.tsx b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceYaml.tsx deleted file mode 100644 index ab2c98cbe..000000000 --- a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceYaml.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import {useIntl} from "umi"; -import React, {useEffect, useRef, useState} from "react"; -import {WsDorisOperatorInstance} from "@/services/project/typings"; -import {ProCard} from "@ant-design/pro-components"; -import Editor, {Monaco, useMonaco} from "@monaco-editor/react"; -import {WsDorisOperatorInstanceService} from "@/services/project/WsDorisOperatorInstanceService"; -import YAML from "yaml"; - -const DorisInstanceDetailYAML: React.FC<{ data: WsDorisOperatorInstance }> = ({data}) => { - const intl = useIntl(); - const editorRef = useRef(null); - const monaco = useMonaco(); - - const [yaml, setYaml] = useState(null); - - useEffect(() => { - monaco?.languages.typescript.javascriptDefaults.setEagerModelSync(true); - }, [monaco]); - - const handleEditorDidMount = (editor, monaco: Monaco) => { - editorRef.current = editor; - } - - useEffect(() => { - const yamlData = {...data} - yamlData.deployed = undefined - WsDorisOperatorInstanceService.asYaml(yamlData).then((response) => { - if (response.success) { - setYaml(YAML.stringify(response.data)) - } - }); - }, []); - - return ( - - - - - - ); -} - -export default DorisInstanceDetailYAML; diff --git a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/YAML/DorisInstanceStatusYaml.tsx b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/YAML/DorisInstanceStatusYaml.tsx new file mode 100644 index 000000000..2842dac3c --- /dev/null +++ b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/YAML/DorisInstanceStatusYaml.tsx @@ -0,0 +1,39 @@ +import React, {useEffect, useRef} from "react"; +import Editor, {Monaco, useMonaco} from "@monaco-editor/react"; +import {Props} from '@/app.d'; +import {WsFlinkKubernetesTemplate} from "@/services/project/typings"; +import {connect} from "umi"; + +const DorisInstanceDetailYAMLStatus: React.FC> = (props: any) => { + const editorRef = useRef(null); + const monaco = useMonaco(); + + useEffect(() => { + // do conditional chaining + monaco?.languages.typescript.javascriptDefaults.setEagerModelSync(true); + }, [monaco]); + + const handleEditorDidMount = (editor, monaco: Monaco) => { + editorRef.current = editor; + } + + return ( + + ); +} +const mapModelToProps = ({dorisInstanceDetail}: any) => ({dorisInstanceDetail}) +export default connect(mapModelToProps)(DorisInstanceDetailYAMLStatus); diff --git a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/YAML/DorisInstanceYaml.tsx b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/YAML/DorisInstanceYaml.tsx new file mode 100644 index 000000000..af9d88769 --- /dev/null +++ b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/YAML/DorisInstanceYaml.tsx @@ -0,0 +1,39 @@ +import React, {useEffect, useRef} from "react"; +import Editor, {Monaco, useMonaco} from "@monaco-editor/react"; +import {Props} from '@/app.d'; +import {WsFlinkKubernetesTemplate} from "@/services/project/typings"; +import {connect} from "umi"; + +const DorisInstanceDetailYAMLInstance: React.FC> = (props: any) => { + const editorRef = useRef(null); + const monaco = useMonaco(); + + useEffect(() => { + // do conditional chaining + monaco?.languages.typescript.javascriptDefaults.setEagerModelSync(true); + }, [monaco]); + + const handleEditorDidMount = (editor, monaco: Monaco) => { + editorRef.current = editor; + } + + return ( + + ); +} +const mapModelToProps = ({dorisInstanceDetail}: any) => ({dorisInstanceDetail}) +export default connect(mapModelToProps)(DorisInstanceDetailYAMLInstance); diff --git a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/YAML/index.tsx b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/YAML/index.tsx new file mode 100644 index 000000000..91a983ec6 --- /dev/null +++ b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/YAML/index.tsx @@ -0,0 +1,27 @@ +import React from "react"; +import {ProCard} from "@ant-design/pro-components"; +import DorisInstanceDetailYAMLInstance + from "@/pages/Project/Workspace/Doris/OperatorInstance/Detail/YAML/DorisInstanceYaml"; +import DorisInstanceDetailYAMLStatus + from "@/pages/Project/Workspace/Doris/OperatorInstance/Detail/YAML/DorisInstanceStatusYaml"; +import {useIntl} from "umi"; +import {Divider} from "antd"; + +const DorisInstanceDetailYAML: React.FC = () => { + const intl = useIntl(); + + return ( + + + + + + + + + + ); +} + +export default DorisInstanceDetailYAML; diff --git a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/index.tsx b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/index.tsx index 93463be83..20d5a93b1 100644 --- a/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/index.tsx +++ b/scaleph-ui-react/src/pages/Project/Workspace/Doris/OperatorInstance/Detail/index.tsx @@ -1,18 +1,35 @@ -import {useIntl, useLocation} from "umi"; -import React from "react"; +import {connect, useIntl, useLocation} from "umi"; +import React, {useEffect} from "react"; import {WsDorisOperatorInstance} from "@/services/project/typings"; import {PageContainer} from "@ant-design/pro-components"; import {Divider} from "antd"; import DorisInstanceDetailComponent from "@/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceComponent"; -import DorisInstanceDetailYAML from "@/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceYaml"; +import DorisInstanceDetailYAML from "@/pages/Project/Workspace/Doris/OperatorInstance/Detail/YAML"; import DorisInstanceDetailAction from "@/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceAction"; import DorisInstanceDetailAccess from "@/pages/Project/Workspace/Doris/OperatorInstance/Detail/DorisInstanceAccess"; -const DorisInstanceDetailWeb: React.FC = () => { +const DorisInstanceDetailWeb: React.FC = (props: any) => { const intl = useIntl(); const data = useLocation().state as WsDorisOperatorInstance + useEffect(() => { + refreshJob(data.id) + let timer = setInterval(() => { + refreshJob(data.id) + }, 10 * 1000); + return () => { + clearInterval(timer); + }; + }, []); + + const refreshJob = (id: number) => { + props.dispatch({ + type: 'dorisInstanceDetail/editInstance', + payload: id + }) + } + return ( @@ -26,4 +43,5 @@ const DorisInstanceDetailWeb: React.FC = () => { ); } -export default DorisInstanceDetailWeb; +const mapModelToProps = ({dorisInstanceDetail}: any) => ({dorisInstanceDetail}) +export default connect(mapModelToProps)(DorisInstanceDetailWeb); diff --git a/scaleph-ui-react/src/services/project/WsDorisOperatorInstanceService.ts b/scaleph-ui-react/src/services/project/WsDorisOperatorInstanceService.ts index 599ab4ef1..cf39c2f67 100644 --- a/scaleph-ui-react/src/services/project/WsDorisOperatorInstanceService.ts +++ b/scaleph-ui-react/src/services/project/WsDorisOperatorInstanceService.ts @@ -1,6 +1,11 @@ import {PageResponse, ResponseBody} from '@/app.d'; import {request} from 'umi'; -import {WsDorisOperatorInstance, WsDorisOperatorInstanceAddParam, WsDorisOperatorInstanceParam, WsDorisOperatorInstanceUpdateParam} from './typings'; +import { + WsDorisOperatorInstance, + WsDorisOperatorInstanceAddParam, + WsDorisOperatorInstanceParam, + WsDorisOperatorInstanceUpdateParam, WsFlinkKubernetesJob +} from './typings'; export const WsDorisOperatorInstanceService = { url: '/api/doris/operator/instance', @@ -20,6 +25,12 @@ export const WsDorisOperatorInstanceService = { }); }, + selectOne: async (id: number) => { + return request>(`${WsDorisOperatorInstanceService.url}/` + id, { + method: 'GET', + }); + }, + fromTemplate: async (templateId: number) => { return request>(`${WsDorisOperatorInstanceService.url}/fromTemplate`, { method: 'GET', @@ -73,4 +84,10 @@ export const WsDorisOperatorInstanceService = { method: 'DELETE', }); }, + + status: async (row: WsDorisOperatorInstance) => { + return request>(`${WsDorisOperatorInstanceService.url}/status/${row.id}`, { + method: 'GET', + }); + }, }; diff --git a/tools/docker/mysql/init.d/scaleph-datasource-mysql.sql b/tools/docker/mysql/init.d/scaleph-datasource-mysql.sql index e57bf88a6..c378bd537 100644 --- a/tools/docker/mysql/init.d/scaleph-datasource-mysql.sql +++ b/tools/docker/mysql/init.d/scaleph-datasource-mysql.sql @@ -53,9 +53,9 @@ CREATE TABLE `ds_type` INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) VALUES (1, 'MySQL', '/images/DataSource/MySQL.png', 10, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) -VALUES (2, 'Oracle', '/images/DataSource/Oracle.svg', 11, NULL, 'sys', 'sys'); +VALUES (2, 'Oracle', '/images/DataSource/Oracle.png', 11, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) -VALUES (3, 'PostgreSQL', '/images/DataSource/PostgreSQL.svg', 12, NULL, 'sys', 'sys'); +VALUES (3, 'PostgreSQL', '/images/DataSource/PostgreSQL.png', 12, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) VALUES (4, 'SQLServer', '/images/DataSource/SQLServer.png', 13, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) @@ -67,19 +67,19 @@ VALUES (7, 'Greenplum', '/images/DataSource/Greenplum.png', 16, NULL, 'sys', 'sy INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) VALUES (8, 'Phoenix', '/images/DataSource/Phoenix.png', 17, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) -VALUES (9, 'Redis', '/images/DataSource/Redis.svg', 18, NULL, 'sys', 'sys'); +VALUES (9, 'Redis', '/images/DataSource/Redis.png', 18, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) VALUES (10, 'Elasticsearch', '/images/DataSource/Elasticsearch.png', 19, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) VALUES (11, 'Solr', '/images/DataSource/Solr.png', 17, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) -VALUES (12, 'MongoDB', '/images/DataSource/MongoDB.svg', 18, NULL, 'sys', 'sys'); +VALUES (12, 'MongoDB', '/images/DataSource/MongoDB.png', 18, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) VALUES (13, 'TiDB', '/images/DataSource/TiDB.png', 19, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) VALUES (14, 'Kafka', '/images/DataSource/Kafka.png', 20, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) -VALUES (15, 'Pulsar', '/images/DataSource/Pulsar.svg', 21, NULL, 'sys', 'sys'); +VALUES (15, 'Pulsar', '/images/DataSource/Pulsar.png', 21, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) VALUES (16, 'DataHub', '/images/DataSource/DataHub.png', 22, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) @@ -91,9 +91,9 @@ VALUES (19, 'OSS', '/images/DataSource/OSS.png', 25, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) VALUES (20, 'S3', '/images/DataSource/S3.png', 26, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) -VALUES (21, 'HDFS', '/images/DataSource/HDFS.svg', 27, NULL, 'sys', 'sys'); +VALUES (21, 'HDFS', '/images/DataSource/HDFS.png', 27, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) -VALUES (22, 'Hive', '/images/DataSource/Hive.svg', 28, NULL, 'sys', 'sys'); +VALUES (22, 'Hive', '/images/DataSource/Hive.png', 28, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`) VALUES (23, 'HBase', '/images/DataSource/HBase.png', 29, NULL, 'sys', 'sys'); INSERT INTO `ds_type`(`id`, `type`, `logo`, `order`, `remark`, `creator`, `editor`)