Merge pull request #4179 from jumpserver/pr@dev@fix_split_job

perf: split job management
This commit is contained in:
ZhaoJiSen
2024-07-04 16:37:39 +08:00
committed by GitHub
6 changed files with 289 additions and 147 deletions

View File

@@ -0,0 +1,129 @@
<template>
<div>
<GenericListTable :header-actions="headerActions" :table-config="tableConfig" />
<JobRunDialog v-if="showJobRunDialog" :item="item" :visible.sync="showJobRunDialog" @submit="runJob" />
</div>
</template>
<script>
import JobRunDialog from '@/views/ops/Job/JobRunDialog'
import GenericListTable from '@/layout/components/GenericListTable'
import { openTaskPage } from '@/utils/jms'
import { ActionsFormatter, DateFormatter, DetailFormatter } from '@/components/Table/TableFormatters'
export default {
components: {
GenericListTable,
JobRunDialog
},
data() {
return {
item: {},
tableConfig: {
url: '/api/v1/ops/jobs/?type=adhoc',
columnsShow: {
min: ['name', 'actions'],
default: [
'name', 'type', 'asset_amount', 'average_time_cost',
'summary', 'date_last_run', 'actions'
]
},
columns: [
'name', 'type', 'summary', 'average_time_cost', 'asset_amount',
'date_last_run', 'comment', 'date_updated', 'date_created', 'actions'
],
columnsMeta: {
name: {
width: '140px',
formatter: DetailFormatter,
formatterArgs: {
can: true,
getRoute: ({ row }) => ({
name: 'JobDetail',
params: { id: row.id }
})
}
},
type: {
width: '96px',
formatter: (row) => {
return row.type.label
}
},
comment: {
width: '240px'
},
summary: {
label: this.$t('Summary'),
formatter: (row) => {
return row.summary['success'] + '/' + row.summary['total']
}
},
average_time_cost: {
formatter: (row) => {
return row.average_time_cost.toFixed(2) + 's'
}
},
asset_amount: {
label: this.$t('AssetsOfNumber'),
formatter: (row) => {
return row.assets.length
}
},
date_last_run: {
width: '140px',
formatter: DateFormatter
},
actions: {
formatter: ActionsFormatter,
formatterArgs: {
hasUpdate: true,
canUpdate: this.$hasPerm('ops.change_job') && !this.$store.getters.currentOrgIsRoot,
updateRoute: 'JobUpdate',
hasDelete: true,
canDelete: this.$hasPerm('ops.delete_job'),
hasClone: false,
extraActions: [
{
title: this.$t('Run'),
name: 'run',
can: this.$hasPerm('ops.add_jobexecution') && !this.$store.getters.currentOrgIsRoot,
callback: ({ row }) => {
if (row?.use_parameter_define && row?.parameters_define) {
const params = JSON.parse(row.parameters_define)
if (Object.keys(params).length > 0) {
this.item = row
this.showJobRunDialog = true
}
} else {
this.runJob(row)
}
}
}
]
}
}
}
},
headerActions: {
createRoute: 'JobCreate',
hasRefresh: true,
hasExport: false,
hasImport: false
},
showJobRunDialog: false
}
},
methods: {
runJob(row, parameters) {
this.$axios.post('/api/v1/ops/job-executions/', {
job: row.id,
parameters: parameters
}).then((resp) => {
openTaskPage(resp.task_id)
})
}
}
}
</script>

View File

@@ -0,0 +1,136 @@
<template>
<div>
<GenericListTable :header-actions="headerActions" :table-config="tableConfig" />
<JobRunDialog v-if="showJobRunDialog" :item="item" :visible.sync="showJobRunDialog" @submit="runJob" />
</div>
</template>
<script>
import JobRunDialog from '@/views/ops/Job/JobRunDialog'
import GenericListTable from '@/layout/components/GenericListTable'
import { openTaskPage } from '@/utils/jms'
import { ActionsFormatter, DateFormatter, DetailFormatter } from '@/components/Table/TableFormatters'
export default {
components: {
GenericListTable,
JobRunDialog
},
data() {
return {
item: {},
tableConfig: {
url: '/api/v1/ops/jobs/?type=playbook',
columnsShow: {
min: ['name', 'actions'],
default: [
'name', 'type', 'asset_amount', 'average_time_cost',
'summary', 'date_last_run', 'actions'
]
},
columns: [
'name', 'type', 'summary', 'average_time_cost', 'asset_amount',
'date_last_run', 'comment', 'date_updated', 'date_created', 'actions'
],
columnsMeta: {
name: {
width: '140px',
formatter: DetailFormatter,
formatterArgs: {
can: true,
getRoute: ({ row }) => ({
name: 'JobDetail',
params: { id: row.id }
})
}
},
type: {
width: '96px',
formatter: (row) => {
return row.type.label
}
},
comment: {
width: '240px'
},
summary: {
label: this.$t('Summary'),
formatter: (row) => {
return row.summary['success'] + '/' + row.summary['total']
}
},
average_time_cost: {
formatter: (row) => {
return row.average_time_cost.toFixed(2) + 's'
}
},
asset_amount: {
label: this.$t('AssetsOfNumber'),
formatter: (row) => {
return row.assets.length
}
},
date_last_run: {
width: '140px',
formatter: DateFormatter
},
actions: {
formatter: ActionsFormatter,
formatterArgs: {
hasUpdate: true,
canUpdate: this.$hasPerm('ops.change_job') && !this.$store.getters.currentOrgIsRoot,
updateRoute: 'JobUpdate',
hasDelete: true,
canDelete: this.$hasPerm('ops.delete_job'),
hasClone: false,
extraActions: [
{
title: this.$t('Run'),
name: 'run',
can: this.$hasPerm('ops.add_jobexecution') && !this.$store.getters.currentOrgIsRoot,
callback: ({ row }) => {
if (row?.use_parameter_define && row?.parameters_define) {
const params = JSON.parse(row.parameters_define)
if (Object.keys(params).length > 0) {
this.item = row
this.showJobRunDialog = true
}
} else {
this.runJob(row)
}
}
}
]
}
}
}
},
headerActions: {
hasRefresh: true,
hasExport: false,
hasImport: false,
createRoute: () => {
return {
name: 'JobCreate',
query: {
type: 'playbook'
}
}
}
},
showJobRunDialog: false
}
},
methods: {
runJob(row, parameters) {
this.$axios.post('/api/v1/ops/job-executions/', {
job: row.id,
parameters: parameters
}).then((resp) => {
openTaskPage(resp.task_id)
})
}
}
}
</script>

View File

@@ -1,151 +1,39 @@
<template> <template>
<div> <TabPage
<JobRunDialog v-if="showJobRunDialog" :item="item" :visible.sync="showJobRunDialog" @submit="runJob" /> :active-menu.sync="activeMenu"
<GenericListPage :header-actions="headerActions" :table-config="tableConfig" /> :submenu="submenu"
</div> >
<component :is="activeMenu" />
</TabPage>
</template> </template>
<script> <script>
import GenericListPage from '@/layout/components/GenericListPage' import Adhoc from './components/Adhoc.vue'
import { ActionsFormatter, DateFormatter, DetailFormatter } from '@/components/Table/TableFormatters' import Playbook from './components/PlayBook.vue'
import JobRunDialog from '@/views/ops/Job/JobRunDialog' import TabPage from '@/layout/components/TabPage/index.vue'
import { openTaskPage } from '@/utils/jms'
export default { export default {
components: { components: {
JobRunDialog, Adhoc,
GenericListPage TabPage,
Playbook
}, },
data() { data() {
return { return {
item: {}, activeMenu: 'Adhoc',
runtime_parameters: {}, submenu: [
showJobRunDialog: false,
tableConfig: {
url: '/api/v1/ops/jobs/',
columnsShow: {
min: ['name', 'actions'],
default: [
'name', 'type', 'asset_amount', 'average_time_cost',
'summary', 'date_last_run', 'actions'
]
},
columns: [
'name', 'type', 'summary', 'average_time_cost', 'asset_amount',
'date_last_run', 'comment', 'date_updated', 'date_created', 'actions'
],
columnsMeta: {
name: {
width: '140px',
formatter: DetailFormatter,
formatterArgs: {
can: true,
getRoute: ({ row }) => ({
name: 'JobDetail',
params: { id: row.id }
})
}
},
type: {
width: '96px',
formatter: (row) => {
return row.type.label
}
},
comment: {
width: '240px'
},
summary: {
label: this.$t('Summary'),
formatter: (row) => {
return row.summary['success'] + '/' + row.summary['total']
}
},
average_time_cost: {
formatter: (row) => {
return row.average_time_cost.toFixed(2) + 's'
}
},
asset_amount: {
label: this.$t('AssetsOfNumber'),
formatter: (row) => {
return row.assets.length
}
},
date_last_run: {
width: '140px',
formatter: DateFormatter
},
actions: {
formatter: ActionsFormatter,
formatterArgs: {
hasUpdate: true,
canUpdate: this.$hasPerm('ops.change_job') && !this.$store.getters.currentOrgIsRoot,
updateRoute: 'JobUpdate',
hasDelete: true,
canDelete: this.$hasPerm('ops.delete_job'),
hasClone: false,
extraActions: [
{ {
title: this.$t('Run'), title: this.$t('AdhocManage'),
name: 'run', name: 'Adhoc',
can: this.$hasPerm('ops.add_jobexecution') && !this.$store.getters.currentOrgIsRoot, hidden: () => !this.$hasPerm('ops.view_adhoc')
callback: ({ row }) => {
if (row?.use_parameter_define && row?.parameters_define) {
const params = JSON.parse(row.parameters_define)
if (Object.keys(params).length > 0) {
this.item = row
this.showJobRunDialog = true
}
} else {
this.runJob(row)
}
}
}
]
}
}
}
},
headerActions: {
createRoute: 'JobCreate',
hasRefresh: true,
hasExport: false,
hasImport: false,
moreCreates: {
callback: (item) => {
this.$router.push({
name: 'JobCreate',
query: { type: item.name }
})
},
dropdown: [
{
name: 'adhoc',
title: this.$t('Command')
}, },
{ {
name: 'playbook', title: this.$t('PlaybookManage'),
title: 'Playbook' name: 'Playbook',
hidden: () => !this.$hasPerm('ops.view_playbook')
} }
] ]
} }
} }
} }
},
methods: {
runJob(row, parameters) {
this.$axios.post('/api/v1/ops/job-executions/', {
job: row.id,
parameters: parameters
}).then((resp) => {
openTaskPage(resp.task_id)
})
}
}
}
</script> </script>
<style>
</style>

View File

@@ -49,7 +49,3 @@ export default {
} }
} }
</script> </script>
<style>
</style>

View File

@@ -36,12 +36,6 @@ export default {
} }
] ]
} }
},
mounted() {
} }
} }
</script> </script>
<style scoped>
</style>

View File

@@ -146,8 +146,7 @@ export default {
} }
} }
} }
}, }
methods: {}
} }
</script> </script>