modify rebuild
This commit is contained in:
parent
2eaf5e6e1b
commit
33c78d2278
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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,10 +127,34 @@ 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>
|
||||
</Table>
|
||||
</Card>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue