modify rebuild

This commit is contained in:
silenceqi 2021-01-04 23:18:54 +08:00
parent 2eaf5e6e1b
commit 33c78d2278
5 changed files with 241 additions and 21 deletions

View File

@ -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) { func (handler APIHandler) HandleGetRebuildListAction(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
defer func() { defer func() {
if err := recover(); err != nil { if err := recover(); err != nil {
@ -169,6 +188,11 @@ func getTasksByTerms(esName string, terms []string) (*elastic.SearchResponse, er
return nil, nil return nil, nil
} }
client := elastic.GetClient(esName) client := elastic.GetClient(esName)
esBody := buildTermsQuery(terms)
return client.SearchWithRawQueryDSL(".tasks", []byte(esBody))
}
func buildTermsQuery(terms []string) string {
esBody := `{ esBody := `{
"query":{ "query":{
"terms": { "terms": {
@ -183,5 +207,28 @@ func getTasksByTerms(esName string, terms []string) (*elastic.SearchResponse, er
strTerms += fmt.Sprintf(`"%s",`, term) strTerms += fmt.Sprintf(`"%s",`, term)
} }
esBody = fmt.Sprintf(esBody, strTerms[0:len(strTerms)-1]) 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
} }

View File

@ -24,5 +24,6 @@ func Init(cfg *config.AppConfig) {
ui.HandleUIMethod(api.POST, pathPrefix+"rebuild/_create", handler.ReindexAction) ui.HandleUIMethod(api.POST, pathPrefix+"rebuild/_create", handler.ReindexAction)
ui.HandleUIMethod(api.GET, pathPrefix+"rebuild/list", handler.HandleGetRebuildListAction) 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) ui.HandleUIMethod(api.GET, pathPrefix+"indices/_mappings/:index", handler.HandleGetMappingsAction)
} }

View File

@ -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 React from 'react';
import {connect} from 'dva' import {connect} from 'dva'
@ -8,15 +9,23 @@ import {connect} from 'dva'
@Form.create() @Form.create()
class RebuildList extends React.Component { class RebuildList extends React.Component {
componentDidMount(){ componentDidMount(){
this.fetchData({
pageSize: 10,
pageIndex: 1,
})
}
fetchData = (params)=>{
const {dispatch} = this.props; const {dispatch} = this.props;
dispatch({ dispatch({
type: 'rebuildlist/fetchRebuildList', type: 'rebuildlist/fetchRebuildList',
payload:{ payload: params,
index: 'infinireindex'
}
}) })
} }
columns = [{ columns = [{
title: 'id',
dataIndex: 'id',
key: 'id',
},{
title: 'rebuild name', title: 'rebuild name',
dataIndex: 'name', dataIndex: 'name',
key: 'name', key: 'name',
@ -28,6 +37,11 @@ class RebuildList extends React.Component {
title: 'status', title: 'status',
dataIndex: 'status', dataIndex: 'status',
key: 'status', key: 'status',
render: (text, record) => (
<span style={{color: text== 'SUCCESS' ? 'green': (text=='FAILED' ? 'red': 'blue')}}>
{text == 'FAILED'? <Tooltip placeholder="top" title={record.error}>{text}</Tooltip> : text}
</span>
),
},{ },{
title: 'took_time', title: 'took_time',
dataIndex: 'took_time', dataIndex: 'took_time',
@ -40,16 +54,53 @@ class RebuildList extends React.Component {
title: 'Operation', title: 'Operation',
render: (text, record) => ( render: (text, record) => (
<div> <div>
<a onClick={() => { <Popconfirm title="Sure to delete?" onConfirm={() => this.handleDeleteClick(record)}><a key="delete">Delete</a>
this.state.selectedRows.push(record); </Popconfirm>
this.handleDeleteClick(); {record.status=='FAILED' ? <span><Divider type="vertical" /><a key="redo" onClick={()=>this.handleRedoClick(record)}>Redo</a></span>
}}>删除</a> : ''}
{record.status=='FAILED' ? [<Divider type="vertical" />,<a onClick={() => {}}>Redo</a>,
]: ''}
</div> </div>
), ),
},]; },];
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(){ render(){
const {getFieldDecorator} = this.props.form; const {getFieldDecorator} = this.props.form;
const formItemLayout = { const formItemLayout = {
@ -57,6 +108,7 @@ class RebuildList extends React.Component {
wrapperCol: { span: 14 }, wrapperCol: { span: 14 },
style: {marginBottom: 0} style: {marginBottom: 0}
}; };
const {rebuildlist} = this.props;
return ( return (
<Card> <Card>
<Form> <Form>
@ -75,10 +127,34 @@ class RebuildList extends React.Component {
</Col> </Col>
</Row> </Row>
</Form> </Form>
<Divider /> <Divider style={{marginBottom:0}} />
<Table columns={this.columns} dataSource={this.props.rebuildlist.data}> <Card
bodyStyle={{padding:0}}
extra={<Link to="/data/rebuild"> <Button type="primary" icon="plus">New</Button></Link>}
bordered={false}>
<Table columns={this.columns}
loading={rebuildlist.isLoading}
bordered
rowKey="id"
expandedRowRender={record => <div>
<Row>
<Col span={12}><span style={{fontSize: 16,color: 'rgba(0, 0, 0, 0.85)'}}>source</span><pre>{JSON.stringify(record.source, null, 2)}</pre></Col>
<Col span={12}><span style={{fontSize: 16,color: 'rgba(0, 0, 0, 0.85)'}}>dest</span><pre>{JSON.stringify(record.dest, null, 2)}</pre></Col>
</Row>
</div>}
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}>
</Table> </Table>
</Card>
</Card> </Card>
) )
} }

View File

@ -1,16 +1,102 @@
import {getRebuildList} from '@/services/rebuild'; import {getRebuildList,reindex, deleteRebuild} from '@/services/rebuild';
import { message } from 'antd'; import { message } from 'antd';
const delay = (ms) => new Promise((resolve) => {
setTimeout(resolve, ms);
});
export default { export default {
namespace: 'rebuildlist', namespace: 'rebuildlist',
state: { state: {
pageIndex: 1,
pageSize: 10,
isLoading: false,
}, },
effects:{ effects:{
*fetchRebuildList({payload}, {call, put}){ *fetchRebuildList({payload}, {call, put}){
let resp = yield call(getRebuildList, payload)
yield put({ yield put({
type: 'saveData', 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
}
}) })
} }
}, },

View File

@ -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){ export async function getRebuildList(payload){
let url = `${pathPrefix}/rebuild/list`; let url = `${pathPrefix}/rebuild/list?`;
payload.name && (url+=`name=${payload.name}`) payload.from && (url+=`from=${payload.from}`)
payload.from && (url+=`name=${payload.from}`) payload.size && (url+=`&size=${payload.size}`)
payload.size && (url+=`name=${payload.size}`) payload.name && (url+=`&name=${payload.name}`)
return request(url,{ return request(url,{
method: 'GET', method: 'GET',
expirys: 0, expirys: 0,