Merge pull request #653 from LinuxSuRen/feat/iotdb
feat: add iotdb support
This commit is contained in:
commit
34eeb2a253
|
@ -6,13 +6,14 @@ import type { Pair } from './types'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
import { Codemirror } from 'vue-codemirror'
|
import { Codemirror } from 'vue-codemirror'
|
||||||
import HistoryInput from '../components/HistoryInput.vue'
|
import HistoryInput from '../components/HistoryInput.vue'
|
||||||
|
import type { Ref } from 'vue'
|
||||||
|
|
||||||
const stores = ref([] as Store[])
|
const stores: Ref<Store[]> = ref([])
|
||||||
const kind = ref('')
|
const kind = ref('')
|
||||||
const store = ref('')
|
const store = ref('')
|
||||||
const sqlQuery = ref('')
|
const sqlQuery = ref('')
|
||||||
const queryResult = ref([] as any[])
|
const queryResult = ref([] as any[])
|
||||||
const queryResultAsJSON= ref('')
|
const queryResultAsJSON = ref('')
|
||||||
const columns = ref([] as string[])
|
const columns = ref([] as string[])
|
||||||
const queryTip = ref('')
|
const queryTip = ref('')
|
||||||
const loadingStores = ref(true)
|
const loadingStores = ref(true)
|
||||||
|
@ -20,7 +21,10 @@ const dataFormat = ref('table')
|
||||||
const dataFormatOptions = ['table', 'json']
|
const dataFormatOptions = ['table', 'json']
|
||||||
const queryDataMeta = ref({} as QueryDataMeta)
|
const queryDataMeta = ref({} as QueryDataMeta)
|
||||||
|
|
||||||
const tablesTree = ref([])
|
interface TreeItem {
|
||||||
|
label: string
|
||||||
|
}
|
||||||
|
const tablesTree = ref([] as TreeItem[])
|
||||||
watch(store, (s) => {
|
watch(store, (s) => {
|
||||||
kind.value = ''
|
kind.value = ''
|
||||||
stores.value.forEach((e: Store) => {
|
stores.value.forEach((e: Store) => {
|
||||||
|
@ -60,6 +64,7 @@ const queryTables = () => {
|
||||||
watch(kind, (k) => {
|
watch(kind, (k) => {
|
||||||
switch (k) {
|
switch (k) {
|
||||||
case 'atest-store-orm':
|
case 'atest-store-orm':
|
||||||
|
case 'atest-store-iotdb':
|
||||||
queryTip.value = 'Enter SQL query'
|
queryTip.value = 'Enter SQL query'
|
||||||
executeQuery()
|
executeQuery()
|
||||||
break;
|
break;
|
||||||
|
@ -144,6 +149,7 @@ const executeQuery = async () => {
|
||||||
const data = await API.DataQueryAsync(store.value, kind.value, queryDataMeta.value.currentDatabase, sqlQuery.value);
|
const data = await API.DataQueryAsync(store.value, kind.value, queryDataMeta.value.currentDatabase, sqlQuery.value);
|
||||||
switch (kind.value) {
|
switch (kind.value) {
|
||||||
case 'atest-store-orm':
|
case 'atest-store-orm':
|
||||||
|
case 'atest-store-iotdb':
|
||||||
ormDataHandler(data)
|
ormDataHandler(data)
|
||||||
success = true
|
success = true
|
||||||
break;
|
break;
|
||||||
|
@ -172,60 +178,64 @@ const executeQuery = async () => {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<el-container style="height: calc(100vh - 50px);">
|
<el-container style="height: calc(100vh - 50px);">
|
||||||
<el-aside v-if="kind === 'atest-store-orm'">
|
<el-aside v-if="kind === 'atest-store-orm' || kind === 'atest-store-iotdb'">
|
||||||
<el-scrollbar>
|
<el-scrollbar>
|
||||||
<el-select v-model="queryDataMeta.currentDatabase" placeholder="Select database" @change="queryTables" filterable>
|
<el-select v-model="queryDataMeta.currentDatabase" placeholder="Select database"
|
||||||
<el-option v-for="item in queryDataMeta.databases" :key="item" :label="item"
|
@change="queryTables" filterable>
|
||||||
:value="item"></el-option>
|
<el-option v-for="item in queryDataMeta.databases" :key="item" :label="item"
|
||||||
</el-select>
|
:value="item"></el-option>
|
||||||
<el-tree :data="tablesTree" node-key="label" @node-click="queryDataFromTable" highlight-current draggable/>
|
</el-select>
|
||||||
</el-scrollbar>
|
<el-tree :data="tablesTree" node-key="label" @node-click="queryDataFromTable" highlight-current
|
||||||
</el-aside>
|
draggable />
|
||||||
<el-container>
|
</el-scrollbar>
|
||||||
<el-header>
|
</el-aside>
|
||||||
<el-form @submit.prevent="executeQuery">
|
<el-container>
|
||||||
<el-row :gutter="10">
|
<el-header>
|
||||||
<el-col :span="4">
|
<el-form @submit.prevent="executeQuery">
|
||||||
<el-form-item>
|
<el-row :gutter="10">
|
||||||
<el-select v-model="store" placeholder="Select store" filterable :loading="loadingStores">
|
<el-col :span="4">
|
||||||
<el-option v-for="item in stores" :key="item.name" :label="item.name"
|
<el-form-item>
|
||||||
:value="item.name" :disabled="!item.ready" :kind="item.kind.name"></el-option>
|
<el-select v-model="store" placeholder="Select store" filterable
|
||||||
</el-select>
|
:loading="loadingStores">
|
||||||
</el-form-item>
|
<el-option v-for="item in stores" :key="item.name" :label="item.name"
|
||||||
</el-col>
|
:value="item.name" :disabled="!item.ready"
|
||||||
<el-col :span="16">
|
:kind="item.kind.name"></el-option>
|
||||||
<el-form-item>
|
</el-select>
|
||||||
<HistoryInput :placeholder="queryTip" :callback="executeQuery" v-model="sqlQuery"/>
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
</el-col>
|
<el-col :span="16">
|
||||||
<el-col :span="2">
|
<el-form-item>
|
||||||
<el-form-item>
|
<HistoryInput :placeholder="queryTip" :callback="executeQuery" v-model="sqlQuery" />
|
||||||
<el-button type="primary" @click="executeQuery">Execute</el-button>
|
</el-form-item>
|
||||||
</el-form-item>
|
</el-col>
|
||||||
</el-col>
|
<el-col :span="2">
|
||||||
<el-col :span="2">
|
<el-form-item>
|
||||||
<el-select v-model="dataFormat" placeholder="Select data format">
|
<el-button type="primary" @click="executeQuery">Execute</el-button>
|
||||||
<el-option v-for="item in dataFormatOptions" :key="item" :label="item" :value="item"></el-option>
|
</el-form-item>
|
||||||
</el-select>
|
</el-col>
|
||||||
</el-col>
|
<el-col :span="2">
|
||||||
</el-row>
|
<el-select v-model="dataFormat" placeholder="Select data format">
|
||||||
</el-form>
|
<el-option v-for="item in dataFormatOptions" :key="item" :label="item"
|
||||||
</el-header>
|
:value="item"></el-option>
|
||||||
<el-main>
|
</el-select>
|
||||||
<div style="display: flex; gap: 8px;">
|
</el-col>
|
||||||
<el-tag type="primary" v-if="queryResult.length > 0">{{ queryResult.length }} rows</el-tag>
|
</el-row>
|
||||||
<el-tag type="primary" v-if="queryDataMeta.duration">{{ queryDataMeta.duration }}</el-tag>
|
</el-form>
|
||||||
<el-tag type="primary" v-for="label in queryDataMeta.labels">{{ label.value }}</el-tag>
|
</el-header>
|
||||||
</div>
|
<el-main>
|
||||||
<el-table :data="queryResult" stripe v-if="dataFormat === 'table'">
|
<div style="display: flex; gap: 8px;">
|
||||||
<el-table-column v-for="col in columns" :key="col" :prop="col" :label="col" sortable/>
|
<el-tag type="primary" v-if="queryResult.length > 0">{{ queryResult.length }} rows</el-tag>
|
||||||
</el-table>
|
<el-tag type="primary" v-if="queryDataMeta.duration">{{ queryDataMeta.duration }}</el-tag>
|
||||||
<Codemirror v-else-if="dataFormat === 'json'"
|
<el-tag type="primary" v-for="label in queryDataMeta.labels">{{ label.value }}</el-tag>
|
||||||
v-model="queryResultAsJSON"/>
|
</div>
|
||||||
</el-main>
|
<el-table :data="queryResult" stripe v-if="dataFormat === 'table'">
|
||||||
</el-container>
|
<el-table-column v-for="col in columns" :key="col" :prop="col" :label="col" sortable />
|
||||||
</el-container>
|
</el-table>
|
||||||
</div>
|
<Codemirror v-else-if="dataFormat === 'json'" v-model="queryResultAsJSON" />
|
||||||
|
</el-main>
|
||||||
|
</el-container>
|
||||||
|
</el-container>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -14,12 +14,12 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {SupportedExtension, SupportedExtensions} from "../store";
|
import { SupportedExtension, SupportedExtensions } from "../store";
|
||||||
|
|
||||||
describe("SupportedExtensions", () => {
|
describe("SupportedExtensions", () => {
|
||||||
test('length check', () => {
|
test('length check', () => {
|
||||||
const extensions = SupportedExtensions()
|
const extensions = SupportedExtensions()
|
||||||
expect(extensions.length).toBe(6)
|
expect(extensions.length).toBe(7)
|
||||||
})
|
})
|
||||||
|
|
||||||
for (const extension of SupportedExtensions()) {
|
for (const extension of SupportedExtensions()) {
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -83,6 +83,11 @@ const storeExtensions = [
|
||||||
}],
|
}],
|
||||||
link: 'https://github.com/LinuxSuRen/atest-ext-store-orm'
|
link: 'https://github.com/LinuxSuRen/atest-ext-store-orm'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'atest-store-iotdb',
|
||||||
|
params: [],
|
||||||
|
link: 'https://github.com/LinuxSuRen/atest-ext-store-iotdb'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'atest-store-etcd',
|
name: 'atest-store-etcd',
|
||||||
params: [],
|
params: [],
|
||||||
|
|
|
@ -8,6 +8,7 @@ Ports in extensions:
|
||||||
| Store | [git](https://github.com/LinuxSuRen/atest-ext-store-git) | 4074 |
|
| Store | [git](https://github.com/LinuxSuRen/atest-ext-store-git) | 4074 |
|
||||||
| Store | [mongodb](https://github.com/LinuxSuRen/atest-ext-store-mongodb) | 4075 |
|
| Store | [mongodb](https://github.com/LinuxSuRen/atest-ext-store-mongodb) | 4075 |
|
||||||
| Store | [redis](https://github.com/LinuxSuRen/atest-ext-store-redis) | |
|
| Store | [redis](https://github.com/LinuxSuRen/atest-ext-store-redis) | |
|
||||||
|
| Store | [iotdb](https://github.com/LinuxSuRen/atest-ext-store-iotdb) | |
|
||||||
| Monitor | [docker-monitor](https://github.com/LinuxSuRen/atest-ext-monitor-docker) | |
|
| Monitor | [docker-monitor](https://github.com/LinuxSuRen/atest-ext-monitor-docker) | |
|
||||||
| Agent | [collector](https://github.com/LinuxSuRen/atest-ext-collector) | |
|
| Agent | [collector](https://github.com/LinuxSuRen/atest-ext-collector) | |
|
||||||
| Secret | [Vault](https://github.com/LinuxSuRen/api-testing-vault-extension) | |
|
| Secret | [Vault](https://github.com/LinuxSuRen/api-testing-vault-extension) | |
|
||||||
|
@ -20,6 +21,7 @@ Ports in extensions:
|
||||||
* Finally, add the extension's name into function [SupportedExtensions](../console/atest-ui/src/views/store.ts).
|
* Finally, add the extension's name into function [SupportedExtensions](../console/atest-ui/src/views/store.ts).
|
||||||
|
|
||||||
## Naming conventions
|
## Naming conventions
|
||||||
|
|
||||||
Please follow the following conventions if you want to add a new store extension:
|
Please follow the following conventions if you want to add a new store extension:
|
||||||
|
|
||||||
`store-xxx`
|
`store-xxx`
|
||||||
|
|
|
@ -1157,6 +1157,9 @@ func (s *server) GetStores(ctx context.Context, in *Empty) (reply *Stores, err e
|
||||||
}
|
}
|
||||||
for _, item := range stores {
|
for _, item := range stores {
|
||||||
grpcStore := ToGRPCStore(item)
|
grpcStore := ToGRPCStore(item)
|
||||||
|
if item.Disabled {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
storeStatus, sErr := s.VerifyStore(ctx, &SimpleQuery{Name: item.Name})
|
storeStatus, sErr := s.VerifyStore(ctx, &SimpleQuery{Name: item.Name})
|
||||||
grpcStore.Ready = sErr == nil && storeStatus.Ready
|
grpcStore.Ready = sErr == nil && storeStatus.Ready
|
||||||
|
|
Loading…
Reference in New Issue