forked from JointCloud/JCC-RIP
Merge pull request 'fix' (#225) from annzee/JCC-RIP:cetc into master
This commit is contained in:
commit
00719beadf
|
@ -561,6 +561,9 @@
|
|||
"updateTime": "Update Time",
|
||||
"inferCard": "Infer Card",
|
||||
"operation": "Single Operation",
|
||||
"allOperation": "All Operation"
|
||||
"allOperation": "All Operation",
|
||||
"selectInstance": "Select Instance",
|
||||
"selectSubInstance": "Select SubInstance",
|
||||
"instanceDes": "Instance Description"
|
||||
}
|
||||
}
|
|
@ -561,6 +561,9 @@
|
|||
"updateTime": "更新时间",
|
||||
"inferCard": "算力卡",
|
||||
"operation": "单独操作",
|
||||
"allOperation": "全部操作"
|
||||
"allOperation": "全部操作",
|
||||
"selectInstance": "选择主实例",
|
||||
"selectSubInstance": "选择子实例",
|
||||
"instanceDes": "实例描述"
|
||||
}
|
||||
}
|
|
@ -67,6 +67,13 @@ export const addDeductiveTextTask = (data) => {
|
|||
data
|
||||
})
|
||||
}
|
||||
export const createDeployTask = (data) => {
|
||||
return request({
|
||||
url: '/pcm/v1/inference/createDeployTask',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export const chatApi = (data) => {
|
||||
return request({
|
||||
|
@ -84,6 +91,17 @@ export const getModelType = () => {
|
|||
export const getModelName = (type) => {
|
||||
return request({ url: '/pcm/v1/inference/modelNames?type=' + type, method: 'get' })
|
||||
}
|
||||
|
||||
export const getClustersByModel = (params) => {
|
||||
return request({ url: '/pcm/v1/inference/getAdaptersByModel', method: 'get', params })
|
||||
}
|
||||
export const getInstanceListByModelType = (params) => {
|
||||
return request({ url: '/pcm/v1/inference/getDeployTasksByType', method: 'get', params })
|
||||
}
|
||||
export const getSubInstanceList = (params) => {
|
||||
return request({ url: '/pcm/v1/inference/getRunningInstanceById', method: 'get', params })
|
||||
}
|
||||
|
||||
export const getDetail = (name, params) => {
|
||||
return request({ url: '/pcm/v1/apps/detail/' + name, method: 'get', params })
|
||||
}
|
||||
|
|
|
@ -15,6 +15,13 @@ const taskManagementRouter = {
|
|||
meta: { activeMenu: '/taskManagement/taskList' },
|
||||
hidden: true
|
||||
},
|
||||
{
|
||||
path: 'createInstance',
|
||||
component: () => import('@/views/taskManagement/aiList/createInstance'),
|
||||
name: 'createInstance',
|
||||
meta: { activeMenu: '/taskManagement/taskList' },
|
||||
hidden: true
|
||||
},
|
||||
{
|
||||
path: 'detail',
|
||||
component: () => import('@/views/taskManagement/taskList/detail'),
|
||||
|
|
|
@ -0,0 +1,230 @@
|
|||
<template>
|
||||
<el-card v-loading="loading" class="list-detail">
|
||||
<el-page-header :content="$t('message.create')" @back="goBack" />
|
||||
<h2>{{ $t('page.instance') + $t('message.create') }}</h2>
|
||||
<div class="formcontainer">
|
||||
<div class="taskForm">
|
||||
<el-form
|
||||
ref="formData"
|
||||
class="form-wrap"
|
||||
label-position="left"
|
||||
:model="formData"
|
||||
:rules="formDataRules"
|
||||
>
|
||||
<el-form-item :label="$t('page.instanceName')" prop="taskName">
|
||||
<el-input
|
||||
v-model="formData.taskName"
|
||||
:placeholder="$t('page.inputWarn')"
|
||||
:max-length="30"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('page.instanceDes')" prop="taskDesc">
|
||||
<el-input
|
||||
v-model="formData.taskDesc"
|
||||
:max-length="100"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('page.modelType')" prop="modelType">
|
||||
<el-select v-model="formData.modelType" style="width: 280px;margin-right: 10px;">
|
||||
<el-option v-for="item in modelTypeList" :key="item" :label="item" :value="item" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('page.modelName')" prop="modelName">
|
||||
<el-select v-model="formData.modelName" style="width: 280px;margin-right: 10px;">
|
||||
<el-option v-for="item in modelNameList" :key="item" :label="item" :value="item" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<div>
|
||||
<el-form-item :label="$t('page.selectCluster')" prop="aiClusterIds">
|
||||
<!-- <el-select v-model="formData.aiClusterIds" style="width: 280px;margin-right: 10px;">
|
||||
<el-option v-for="item in formData.staticWeightMap" :key="item.id" :label="item.key" :value="item.id" />
|
||||
</el-select> -->
|
||||
<table class="tableInput">
|
||||
<tr v-for="env in clusterList" :key="env.adapterId">
|
||||
<td>
|
||||
<el-checkbox v-model="env.selected" size="small" />
|
||||
{{ env.adapterName }}</td>
|
||||
<td>
|
||||
<el-select v-model="env.selectedclusters" style="width: 280px;margin-right: 10px;" multiple>
|
||||
<el-option v-for="item in env.clusters" :key="item.clusterId" :label="item.clusterName" :value="item.clusterId" />
|
||||
</el-select>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</el-form-item>
|
||||
</div>
|
||||
|
||||
</el-form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<el-row type="flex" justify="end">
|
||||
<el-col :span="2.5">
|
||||
<el-button size="medium" @click="goBack">{{ $t("message.cancel") }}</el-button>
|
||||
<el-button size="medium" type="primary" @click="saveForm">{{ $t("message.create") }}</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// import List from '@/components/list'
|
||||
import { getClusterList } from '@/api/container/cluster'
|
||||
import { mapGetters } from 'vuex'
|
||||
import { getModelType, getModelName, createDeployTask, getClustersByModel } from '@/api/task/task'
|
||||
|
||||
// import jobForm from './components/jobForm.vue'
|
||||
export default {
|
||||
// components: { List },
|
||||
data() {
|
||||
return {
|
||||
getClusterList,
|
||||
tableListData: [],
|
||||
isEdit: false,
|
||||
loading: false,
|
||||
submitLoading: false,
|
||||
selectCluster: false,
|
||||
strategySetting: false,
|
||||
formData: {
|
||||
taskName: '',
|
||||
taskDesc: '',
|
||||
modelName: '',
|
||||
modelType: '',
|
||||
adapterClusterMap: []
|
||||
},
|
||||
clusterList: {
|
||||
},
|
||||
modelTypeList: [],
|
||||
modelNameList: []
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapGetters([
|
||||
'dict'
|
||||
]),
|
||||
columns() {
|
||||
return this.setColumn()
|
||||
},
|
||||
formDataRules() {
|
||||
return {
|
||||
taskName: [
|
||||
{ required: true, message: this.$t('check.input') + this.$t('message.name') }
|
||||
// {
|
||||
// pattern: /^[a-z]([-a-z0-9]*[a-z0-9])?$/,
|
||||
// message: this.$t('check.inputInvalid')
|
||||
// }
|
||||
// { validator: this.nameValidator }
|
||||
],
|
||||
taskDesc: [
|
||||
{ required: true, message: this.$t('check.input') + this.$t('page.taskDes') }
|
||||
],
|
||||
modelType: [{ required: true, message: this.$t('check.requireSelect'), trigger: 'change' }],
|
||||
modelName: [{ required: true, message: this.$t('check.requireSelect'), trigger: 'change' }]
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'formData.modelType'(val) {
|
||||
if (val) {
|
||||
this.formData.modelName = ''
|
||||
getModelName(val).then(e => {
|
||||
this.modelNameList = e.data.models
|
||||
})
|
||||
}
|
||||
},
|
||||
'formData.modelName'(val) {
|
||||
if (val && this.formData.modelType) {
|
||||
this.clusterList = {}
|
||||
getClustersByModel({ modelType: this.formData.modelType, modelName: val }).then(e => {
|
||||
this.clusterList = e.data.adapters
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
getModelType().then(e => {
|
||||
this.modelTypeList = e.data.types
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
getCluster() {
|
||||
const query = { 'type': this.taskType === 'application' ? '0' : (this.taskType === 'aiBase' || this.taskType === 'aiCard') ? '1' : this.taskType === 'hpcBase' ? '2' : '0', 'adapterId': this.formData.adapterId, pageNum: 1, pageSize: 1000 }
|
||||
this.getClusterList(query).then(e => {
|
||||
this.currentClusterList = e.data.list || []
|
||||
})
|
||||
},
|
||||
goBack() {
|
||||
this.$router.push({ path: '/taskManagement/aiList' })
|
||||
},
|
||||
saveForm() {
|
||||
this.$refs.formData.validate((valid) => {
|
||||
if (valid) {
|
||||
console.log(this.clusterList)
|
||||
this.formData.adapterClusterMap = {}
|
||||
this.clusterList.forEach(e => {
|
||||
if (e.selected) {
|
||||
this.formData.adapterClusterMap[e.adapterId] = e.selectedclusters
|
||||
}
|
||||
})
|
||||
const form = new FormData()
|
||||
form.set('taskName', this.formData.taskName)
|
||||
form.set('taskDesc', this.formData.taskDesc)
|
||||
form.set('modelName', this.formData.modelName)
|
||||
form.set('modelType', this.formData.modelType)
|
||||
form.set('adapterClusterMap', JSON.stringify(this.formData.adapterClusterMap))
|
||||
|
||||
createDeployTask(form).then(e => {
|
||||
this.$message.success(this.$t('page.createdSuccess'))
|
||||
this.$router.push({ path: '/taskManagement/aiList' })
|
||||
}).catch(e => {
|
||||
this.submitLoading = false
|
||||
})
|
||||
console.log(this.formData)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.formcontainer{
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
.taskForm{
|
||||
border: 1px solid #2B3948;
|
||||
padding: 20px;
|
||||
}
|
||||
.tableInput{
|
||||
width: 50%;
|
||||
border: 1px solid gray;
|
||||
border-collapse: collapse;
|
||||
.el-form-item{
|
||||
margin: 0!important;
|
||||
}
|
||||
td, th{
|
||||
padding: 1em;
|
||||
border-left: 1px solid gray;
|
||||
|
||||
}
|
||||
td:first-child, th:first-child{
|
||||
border-left: 0;
|
||||
}
|
||||
tr{
|
||||
border-top: 1px solid gray;
|
||||
}
|
||||
tr:first-child {
|
||||
border-top: 0;
|
||||
}
|
||||
}
|
||||
.sliderSet{
|
||||
.el-slider__marks-text:last-child{
|
||||
width: 100px!important;
|
||||
}
|
||||
.el-slider__marks-text:first-child{
|
||||
text-align: right;
|
||||
padding-left: 2rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -167,15 +167,15 @@ export default {
|
|||
getAiTaskList({ pageNum: 1, pageSize: 10 }).then(e => {
|
||||
this.tableData = []
|
||||
e.data.list.forEach(i => {
|
||||
i.instances.forEach(p => {
|
||||
i.instances ? i.instances.forEach(p => {
|
||||
this.tableData.push({ ...p, name: i.name, mainId: i.id })
|
||||
})
|
||||
}) : ''
|
||||
})
|
||||
console.log(this.tableData)
|
||||
// console.log(this.tableData)
|
||||
})
|
||||
},
|
||||
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
|
||||
if (columnIndex === 0 || columnIndex === 1 || columnIndex === 2 || columnIndex === 10) {
|
||||
if (columnIndex === 0 || columnIndex === 1 || columnIndex === 2 || columnIndex === 3 || columnIndex === 11) {
|
||||
if (
|
||||
rowIndex === 0 ||
|
||||
row.deployTaskId !== this.tableData[rowIndex - 1].deployTaskId
|
||||
|
@ -194,7 +194,11 @@ export default {
|
|||
prop: 'name',
|
||||
label: this.$t('page.instanceName')
|
||||
},
|
||||
{ prop: 'modelName', label: this.$t('page.modelName'), formatter: (row) => { return <a onClick={() => this.viewDetail(row)}>{row.modelName}</a> } },
|
||||
{
|
||||
prop: 'desc',
|
||||
label: this.$t('page.instance') + this.$t('page.description')
|
||||
},
|
||||
{ prop: 'modelName', label: this.$t('page.modelName') },
|
||||
{ prop: 'modelType', label: this.$t('page.modelType') },
|
||||
{
|
||||
prop: 'instanceName',
|
||||
|
@ -263,7 +267,7 @@ export default {
|
|||
this.$router.push({ path: `detail`, query: { id: row.id }})
|
||||
},
|
||||
createItem() {
|
||||
this.$router.push({ path: `create` })
|
||||
this.$router.push({ path: `createInstance` })
|
||||
},
|
||||
handleClick() {
|
||||
console.log('switch')
|
||||
|
@ -275,7 +279,7 @@ export default {
|
|||
id: row.id,
|
||||
instanceId: row.instanceId
|
||||
}
|
||||
const allId = { id: row.mainId }
|
||||
const allId = { deployTaskId: row.mainId }
|
||||
|
||||
if (type === 1 || type === 3) {
|
||||
this.$confirm('<p>确定要启动么?</p>', '温馨提示', {
|
||||
|
|
|
@ -46,9 +46,14 @@
|
|||
<el-option v-for="item in modelTypeList" :key="item" :label="item" :value="item" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('page.selectModel')" prop="modelName">
|
||||
<el-select v-model="formData.modelName" style="width: 280px;margin-right: 10px;">
|
||||
<el-option v-for="item in modelNameList" :key="item" :label="item" :value="item" />
|
||||
<el-form-item :label="$t('page.selectInstance')" prop="deployTaskId">
|
||||
<el-select v-model="formData.deployTaskId" style="width: 280px;margin-right: 10px;">
|
||||
<el-option v-for="item in instanceList" :key="item.Id" :label="item.Name" :value="item.Id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('page.selectSubInstance')" prop="instanceIds">
|
||||
<el-select v-model="formData.instanceIds" style="margin-right: 10px;" :multiple="formData.modelType.indexOf('image') === 0">
|
||||
<el-option v-for="item in subInstanceList" :key="item.id" :label="'名称:'+item.instanceName+',驱动器:'+item.adapterName+',集群:'+item.clusterName" :value="Number(item.id)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
|
@ -100,7 +105,7 @@
|
|||
/>
|
||||
</el-form-item> -->
|
||||
|
||||
<div v-if="formData.modelType === 'image_recognition'">
|
||||
<div v-if="formData.modelType&&formData.modelType.indexOf('image') === 0">
|
||||
<el-form-item :label="$t('page.pictureUpload')">
|
||||
<!-- <el-input v-model="taskInput" type="textarea" rows="10" /> -->
|
||||
<el-upload
|
||||
|
@ -132,13 +137,13 @@
|
|||
</table>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div v-if="formData.modelType === 'text_to_text'">
|
||||
<!-- <div v-if="formData.modelType === 'text_to_text'">
|
||||
<el-form-item :label="$t('page.selectCluster')" prop="aiClusterIds">
|
||||
<el-select v-model="formData.aiClusterIds" style="width: 280px;margin-right: 10px;">
|
||||
<el-option v-for="item in formData.staticWeightMap" :key="item.id" :label="item.key" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
</el-form>
|
||||
|
||||
|
@ -146,7 +151,7 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import { getModelName, getModelType } from '@/api/task/task'
|
||||
import { getInstanceListByModelType, getSubInstanceList, getModelType } from '@/api/task/task'
|
||||
import generate from 'nanoid/generate'
|
||||
import { getClusterList } from '@/api/container/cluster'
|
||||
|
||||
|
@ -163,14 +168,16 @@ export default {
|
|||
'taskName': 'deductiveTask-' + generate('abcdefghijklmnopqrstuvwxyz', 12),
|
||||
'taskDesc': '',
|
||||
'modelType': '',
|
||||
'modelName': '',
|
||||
'deployTaskId': '',
|
||||
'staticWeightMap': [],
|
||||
'strategy': 'staticWeight',
|
||||
'aiClusterIds': ''
|
||||
'aiClusterIds': '',
|
||||
'instanceIds': []
|
||||
},
|
||||
fileList: [],
|
||||
modelTypeList: [],
|
||||
modelNameList: [],
|
||||
instanceList: [],
|
||||
subInstanceList: [],
|
||||
currentClusterList: []
|
||||
}
|
||||
},
|
||||
|
@ -189,7 +196,7 @@ export default {
|
|||
{ required: true, message: this.$t('check.input') + this.$t('page.taskDes') }
|
||||
],
|
||||
modelType: [{ required: true, message: this.$t('check.requireSelect'), trigger: 'change' }],
|
||||
modelName: [{ required: true, message: this.$t('check.requireSelect'), trigger: 'change' }]
|
||||
deployTaskId: [{ required: true, message: this.$t('check.requireSelect'), trigger: 'change' }]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -205,9 +212,17 @@ export default {
|
|||
},
|
||||
'formData.modelType'(val) {
|
||||
if (val) {
|
||||
this.formData.modelName = ''
|
||||
getModelName(val).then(e => {
|
||||
this.modelNameList = e.data.models
|
||||
this.formData.deployTaskId = ''
|
||||
getInstanceListByModelType({ modelType: val }).then(e => {
|
||||
this.instanceList = e.data.list
|
||||
})
|
||||
}
|
||||
},
|
||||
'formData.deployTaskId'(val) {
|
||||
if (val && this.adapterId) {
|
||||
this.formData.instanceIds = []
|
||||
getSubInstanceList({ deployTaskId: val, adapterId: this.adapterId }).then(e => {
|
||||
this.subInstanceList = e.data.list
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -249,7 +264,7 @@ export default {
|
|||
this.$refs.formData.validate((valid) => {
|
||||
if (valid) {
|
||||
const form = new FormData()
|
||||
if (this.formData.modelType === 'image_recognition') {
|
||||
if (this.formData.modelType.indexOf('image') === 0) {
|
||||
this.$refs.upload.uploadFiles.forEach((file, index) => {
|
||||
form.append(`images`, file.raw)
|
||||
})
|
||||
|
@ -257,17 +272,19 @@ export default {
|
|||
this.formData.staticWeightMap.forEach(e => {
|
||||
obj[e.id.toString()] = e.value
|
||||
})
|
||||
form.set('staticWeightMap', JSON.stringify(obj))
|
||||
form.set('staticWeightMap', JSON.stringify({ [this.adapterId]: obj }))
|
||||
form.set('strategy', this.formData.strategy)
|
||||
form.set('instanceIds', JSON.stringify(this.formData.instanceIds))
|
||||
} else {
|
||||
const arr = this.formData.aiClusterIds.split()
|
||||
form.set('aiClusterIds', JSON.stringify(arr))
|
||||
// const arr = this.formData.aiClusterIds.split()
|
||||
// form.set('aiClusterIds', JSON.stringify(arr))
|
||||
form.set('instanceId', this.formData.instanceIds)
|
||||
}
|
||||
form.set('taskName', this.formData.taskName)
|
||||
form.set('taskDesc', this.formData.taskDesc)
|
||||
form.set('modelType', this.formData.modelType)
|
||||
form.set('modelName', this.formData.modelName)
|
||||
form.set('adapterId', this.adapterId)
|
||||
// form.set('deployTaskId', this.formData.deployTaskId)
|
||||
// form.set('adapterId', this.adapterId)
|
||||
returnVal = form
|
||||
} else {
|
||||
returnVal = false
|
||||
|
|
|
@ -517,7 +517,7 @@ export default {
|
|||
break
|
||||
}
|
||||
case 'deductive': {
|
||||
if (formHook.get('modelType') === 'image_recognition') {
|
||||
if (formHook.get('modelType').indexOf('image') === 0) {
|
||||
addDeductiveImageTask(formHook).then((e) => {
|
||||
if (e.code === 200) {
|
||||
this.$message.success('文件上传成功')
|
||||
|
|
Loading…
Reference in New Issue