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) {
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
}

View File

@ -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)
}

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 {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) => (
<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',
dataIndex: 'took_time',
@ -40,16 +54,53 @@ class RebuildList extends React.Component {
title: 'Operation',
render: (text, record) => (
<div>
<a onClick={() => {
this.state.selectedRows.push(record);
this.handleDeleteClick();
}}>删除</a>
{record.status=='FAILED' ? [<Divider type="vertical" />,<a onClick={() => {}}>Redo</a>,
]: ''}
<Popconfirm title="Sure to delete?" onConfirm={() => this.handleDeleteClick(record)}><a key="delete">Delete</a>
</Popconfirm>
{record.status=='FAILED' ? <span><Divider type="vertical" /><a key="redo" onClick={()=>this.handleRedoClick(record)}>Redo</a></span>
: ''}
</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(){
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 (
<Card>
<Form>
@ -75,11 +127,35 @@ class RebuildList extends React.Component {
</Col>
</Row>
</Form>
<Divider />
<Table columns={this.columns} dataSource={this.props.rebuildlist.data}>
<Divider style={{marginBottom:0}} />
<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>
</Card>
</Card>
)
}
}

View File

@ -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
}
})
}
},

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){
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,