From 33c78d2278421af1f60769938a021d8333938822 Mon Sep 17 00:00:00 2001 From: silenceqi Date: Mon, 4 Jan 2021 23:18:54 +0800 Subject: [PATCH] modify rebuild --- api/index_management/rebuild.go | 49 ++++++++- api/init.go | 1 + web/src/pages/DataManagement/RebuildList.js | 102 +++++++++++++++--- .../DataManagement/models/rebuildlist.js | 92 +++++++++++++++- web/src/services/rebuild.js | 18 +++- 5 files changed, 241 insertions(+), 21 deletions(-) diff --git a/api/index_management/rebuild.go b/api/index_management/rebuild.go index ff9e0ab6..591221e9 100644 --- a/api/index_management/rebuild.go +++ b/api/index_management/rebuild.go @@ -97,6 +97,25 @@ func newResponseBody() map[string]interface{} { } +func (handler APIHandler) HandleDeleteRebuildAction(w http.ResponseWriter, req *http.Request, ps httprouter.Params) { + var ids = []string{} + resBody := newResponseBody() + err := handler.DecodeJSON(req, &ids) + if err != nil { + resBody["errno"] = "E30001" + resBody["errmsg"] = err.Error() + handler.WriteJSON(w, resBody, http.StatusOK) + return + } + err = deleteTasksByTerms(handler.Config.Elasticsearch, ids) + if err != nil { + resBody["errno"] = "E30002" + resBody["errmsg"] = err.Error() + } + resBody["payload"] = true + handler.WriteJSON(w, resBody, http.StatusOK) +} + func (handler APIHandler) HandleGetRebuildListAction(w http.ResponseWriter, req *http.Request, ps httprouter.Params) { defer func() { if err := recover(); err != nil { @@ -169,6 +188,11 @@ func getTasksByTerms(esName string, terms []string) (*elastic.SearchResponse, er return nil, nil } client := elastic.GetClient(esName) + esBody := buildTermsQuery(terms) + return client.SearchWithRawQueryDSL(".tasks", []byte(esBody)) +} + +func buildTermsQuery(terms []string) string { esBody := `{ "query":{ "terms": { @@ -183,5 +207,28 @@ func getTasksByTerms(esName string, terms []string) (*elastic.SearchResponse, er strTerms += fmt.Sprintf(`"%s",`, term) } esBody = fmt.Sprintf(esBody, strTerms[0:len(strTerms)-1]) - return client.SearchWithRawQueryDSL(".tasks", []byte(esBody)) + return esBody +} + +func deleteTasksByTerms(esName string, terms []string) error { + client := elastic.GetClient(esName) + esConfig := elastic.GetConfig(esName) + url := fmt.Sprintf("%s/infinireindex/_delete_by_query", esConfig.Endpoint) + esBody := buildTermsQuery(terms) + result, err := client.Request("POST", url, []byte(esBody)) + if err != nil { + return err + } + var deleteRes = struct { + Deleted int `json:"deleted"` + Total int `json:"total"` + }{} + err = json.Unmarshal(result.Body, &deleteRes) + if err != nil { + return err + } + if deleteRes.Deleted != deleteRes.Total { + return fmt.Errorf("total: %d, deleted: %d", deleteRes.Total, deleteRes.Deleted) + } + return nil } diff --git a/api/init.go b/api/init.go index 74dd0f48..befd82e3 100644 --- a/api/init.go +++ b/api/init.go @@ -24,5 +24,6 @@ func Init(cfg *config.AppConfig) { ui.HandleUIMethod(api.POST, pathPrefix+"rebuild/_create", handler.ReindexAction) ui.HandleUIMethod(api.GET, pathPrefix+"rebuild/list", handler.HandleGetRebuildListAction) + ui.HandleUIMethod(api.POST, pathPrefix+"rebuild/_delete", handler.HandleDeleteRebuildAction) ui.HandleUIMethod(api.GET, pathPrefix+"indices/_mappings/:index", handler.HandleGetMappingsAction) } diff --git a/web/src/pages/DataManagement/RebuildList.js b/web/src/pages/DataManagement/RebuildList.js index 00c1777c..1afcd61e 100644 --- a/web/src/pages/DataManagement/RebuildList.js +++ b/web/src/pages/DataManagement/RebuildList.js @@ -1,4 +1,5 @@ -import { Card, Table, Form, Row, Input, Col, Button, Divider } from 'antd'; +import { Card, Table, Form, Row, Input, Col, Button, Divider, Tooltip,Popconfirm } from 'antd'; +import Link from 'umi/link'; import React from 'react'; import {connect} from 'dva' @@ -8,15 +9,23 @@ import {connect} from 'dva' @Form.create() class RebuildList extends React.Component { componentDidMount(){ + this.fetchData({ + pageSize: 10, + pageIndex: 1, + }) + } + fetchData = (params)=>{ const {dispatch} = this.props; dispatch({ type: 'rebuildlist/fetchRebuildList', - payload:{ - index: 'infinireindex' - } + payload: params, }) } columns = [{ + title: 'id', + dataIndex: 'id', + key: 'id', + },{ title: 'rebuild name', dataIndex: 'name', key: 'name', @@ -28,6 +37,11 @@ class RebuildList extends React.Component { title: 'status', dataIndex: 'status', key: 'status', + render: (text, record) => ( + + {text == 'FAILED'? {text} : text} + + ), },{ title: 'took_time', dataIndex: 'took_time', @@ -40,16 +54,53 @@ class RebuildList extends React.Component { title: 'Operation', render: (text, record) => (
- { - this.state.selectedRows.push(record); - this.handleDeleteClick(); - }}>删除 - {record.status=='FAILED' ? [, {}}>Redo, - ]: ''} + this.handleDeleteClick(record)}>Delete + + {record.status=='FAILED' ? this.handleRedoClick(record)}>Redo + : ''}
), },]; + + handleDeleteClick =(record)=>{ + const {dispatch} = this.props; + dispatch({ + type: 'rebuildlist/deleteTask', + payload: [record.id], + }) + } + + handleRedoClick = (record)=>{ + const {dispatch} = this.props; + dispatch({ + type: 'rebuildlist/redoTask', + payload: record, + }) + } + + handleTableChange = (pagination, filters, sorter) =>{ + //console.log(pagination, filters, sorter); + const {rebuildlist} = this.props; + this.fetchData({ + pageIndex: pagination.current, + pageSize: pagination.pageSize, + name: rebuildlist.name, + // sort: (sorter.order && sorter.field) || '', + // sort_direction: sorter.order == 'ascend' ? 'asc' : 'desc' + }) + } + + handleSearch = ()=>{ + const {form} = this.props; + let nameVal = form.getFieldValue('name'); + this.fetchData({ + pageIndex: 1, + pageSize: 10, + name: nameVal, + }) + } + render(){ const {getFieldDecorator} = this.props.form; const formItemLayout = { @@ -57,6 +108,7 @@ class RebuildList extends React.Component { wrapperCol: { span: 14 }, style: {marginBottom: 0} }; + const {rebuildlist} = this.props; return (
@@ -75,10 +127,34 @@ class RebuildList extends React.Component {
- - + + } + bordered={false}> +
+ +
source
{JSON.stringify(record.source, null, 2)}
+ dest
{JSON.stringify(record.dest, null, 2)}
+ + } + onChange={this.handleTableChange} + pagination={{ + showSizeChanger: true, + total: rebuildlist.total? rebuildlist.total.value: 0, + pageSize: rebuildlist.pageSize, + current: rebuildlist.pageIndex, + showTotal: (total, range) => `Total ${total} items`, + size: 'small', + }} + dataSource={rebuildlist.data}> -
+ +
) } diff --git a/web/src/pages/DataManagement/models/rebuildlist.js b/web/src/pages/DataManagement/models/rebuildlist.js index 2e96a05d..b1120c86 100644 --- a/web/src/pages/DataManagement/models/rebuildlist.js +++ b/web/src/pages/DataManagement/models/rebuildlist.js @@ -1,16 +1,102 @@ -import {getRebuildList} from '@/services/rebuild'; +import {getRebuildList,reindex, deleteRebuild} from '@/services/rebuild'; import { message } from 'antd'; +const delay = (ms) => new Promise((resolve) => { + setTimeout(resolve, ms); +}); + export default { namespace: 'rebuildlist', state: { + pageIndex: 1, + pageSize: 10, + isLoading: false, }, effects:{ *fetchRebuildList({payload}, {call, put}){ - let resp = yield call(getRebuildList, payload) yield put({ type: 'saveData', - payload: resp.payload + payload: { + isLoading: true, + } + }) + let resp = yield call(getRebuildList, { + ...payload, + from: (payload.pageIndex - 1) * payload.pageSize, + size: payload.pageSize, + }) + if(resp.errno != "0"){ + message.error('fetch data failed') + return + } + yield put({ + type: 'saveData', + payload: { + ...payload, + ...resp.payload, + isLoading: false + } + }) + }, + *redoTask({payload}, {call, put, take}){ + yield put({ + type: 'saveData', + payload: { + isLoading: true, + } + }) + if(typeof payload.source._source ==='string' && payload.source._source != ''){ + payload.source._source = payload.source._source.split(','); + } + let resp = yield call(reindex, { + name: 'redo ' + payload.name, + desc: payload.desc, + dest: payload.dest, + source: payload.source, + }); + if(resp.errno != "0"){ + message.error(resp.errmsg) + return + } + message.success('requet submit success') + yield call(delay, 1000); + yield put({ + type: 'fetchRebuildList', + payload: { + pageIndex: 1, + pageSize: 10 + } + }) + yield take('b/@@fetchRebuildList') + + yield put({ + type: 'saveData', + payload: { + isLoading: false, + } + }) + }, + *deleteTask({payload}, {call, put, select}){ + yield put({ + type: 'saveData', + payload: { + isLoading: true, + } + }) + let resp = yield call(deleteRebuild, payload); + if(resp.errno != "0"){ + message.error("delete failed") + return + } + yield call(delay, 1000); + let {pageIndex, pageSize, name} = select(state=>state.rebuildlist); + yield put({ + type: 'fetchRebuildList', + payload: { + pageIndex: pageIndex, + pageSize: pageSize, + name: name + } }) } }, diff --git a/web/src/services/rebuild.js b/web/src/services/rebuild.js index 80bc155d..fa1c1d4b 100644 --- a/web/src/services/rebuild.js +++ b/web/src/services/rebuild.js @@ -10,11 +10,21 @@ export async function reindex(payload){ }); } +export async function deleteRebuild(payload){ + let url = `${pathPrefix}/rebuild/_delete`; + return request(url,{ + method: 'POST', + body: payload, + expirys: 0, + }); +} + + export async function getRebuildList(payload){ - let url = `${pathPrefix}/rebuild/list`; - payload.name && (url+=`name=${payload.name}`) - payload.from && (url+=`name=${payload.from}`) - payload.size && (url+=`name=${payload.size}`) + let url = `${pathPrefix}/rebuild/list?`; + payload.from && (url+=`from=${payload.from}`) + payload.size && (url+=`&size=${payload.size}`) + payload.name && (url+=`&name=${payload.name}`) return request(url,{ method: 'GET', expirys: 0,