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) => (
),
},];
+
+ 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 (
-
-
+
+ }
+ 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,