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) {
|
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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue