| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| |
| <template> |
| <div class="form-layout" v-ctrl-enter="handleSubmit"> |
| <a-spin :spinning="loading"> |
| <a-alert |
| v-if="resource" |
| type="info" |
| style="margin-bottom: 16px"> |
| <template #message> |
| <div style="display: block; width: 100%;"> |
| <div style="display: block; margin-bottom: 8px;"> |
| <strong>{{ $t('message.clone.offering.from') }}: {{ resource.name }}</strong> |
| </div> |
| <div style="display: block; font-size: 12px;"> |
| {{ $t('message.clone.offering.edit.hint') }} |
| </div> |
| </div> |
| </template> |
| </a-alert> |
| <DiskOfferingForm |
| ref="formRef" |
| :initialValues="form" |
| :apiParams="apiParams" |
| :isAdmin="isAdmin" |
| @submit="handleSubmit"> |
| <template #form-actions> |
| <div :span="24" class="action-button"> |
| <a-button @click="closeAction">{{ $t('label.cancel') }}</a-button> |
| <a-button :loading="loading" ref="submit" type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button> |
| </div> |
| </template> |
| </DiskOfferingForm> |
| </a-spin> |
| </div> |
| </template> |
| |
| <script> |
| import DiskOfferingForm from '@/components/offering/DiskOfferingForm' |
| import { reactive } from 'vue' |
| import { postAPI } from '@/api' |
| import { isAdmin } from '@/role' |
| |
| export default { |
| name: 'CloneDiskOffering', |
| components: { |
| DiskOfferingForm |
| }, |
| props: { |
| resource: { |
| type: Object, |
| required: true |
| } |
| }, |
| data () { |
| return { |
| formRef: null, |
| form: reactive({}), |
| loading: false |
| } |
| }, |
| beforeCreate () { |
| this.apiParams = this.$getApiParams('cloneDiskOffering') |
| }, |
| created () { |
| this.populateFormFromResource() |
| }, |
| methods: { |
| populateFormFromResource () { |
| if (!this.resource) return |
| |
| const r = this.resource |
| this.form.name = r.name + ' - Clone' |
| this.form.displaytext = r.displaytext |
| |
| if (r.storagetype) { |
| this.form.storagetype = r.storagetype |
| } |
| if (r.provisioningtype) { |
| this.form.provisioningtype = r.provisioningtype |
| } |
| if (r.customized !== undefined) { |
| this.form.customdisksize = r.customized |
| } |
| if (r.disksize) this.form.disksize = r.disksize |
| |
| if (r.cachemode) { |
| this.form.writecachetype = r.cachemode |
| } |
| |
| if (r.disksizestrictness !== undefined) { |
| this.form.disksizestrictness = r.disksizestrictness |
| } |
| if (r.encrypt !== undefined) { |
| this.form.encryptdisk = r.encrypt |
| } |
| |
| if (r.diskBytesReadRate || r.diskBytesReadRateMax || r.diskBytesWriteRate || r.diskBytesWriteRateMax || r.diskIopsReadRate || r.diskIopsWriteRate) { |
| this.form.qostype = 'hypervisor' |
| if (r.diskBytesReadRate) this.form.diskbytesreadrate = r.diskBytesReadRate |
| if (r.diskBytesReadRateMax) this.form.diskbytesreadratemax = r.diskBytesReadRateMax |
| if (r.diskBytesWriteRate) this.form.diskbyteswriterate = r.diskBytesWriteRate |
| if (r.diskBytesWriteRateMax) this.form.diskbyteswriteratemax = r.diskBytesWriteRateMax |
| if (r.diskIopsReadRate) this.form.diskiopsreadrate = r.diskIopsReadRate |
| if (r.diskIopsWriteRate) this.form.diskiopswriterate = r.diskIopsWriteRate |
| } else if (r.miniops || r.maxiops) { |
| this.form.qostype = 'storage' |
| if (r.miniops) this.form.diskiopsmin = r.miniops |
| if (r.maxiops) this.form.diskiopsmax = r.maxiops |
| if (r.hypervisorsnapshotreserve) this.form.hypervisorsnapshotreserve = r.hypervisorsnapshotreserve |
| } |
| if (r.iscustomizediops !== undefined) { |
| this.form.iscustomizeddiskiops = r.iscustomizediops |
| } |
| |
| if (r.tags) { |
| this.form.tags = r.tags.split(',') |
| } |
| |
| if (r.vspherestoragepolicy) this.form.storagepolicy = r.vspherestoragepolicy |
| }, |
| isAdmin () { |
| return isAdmin() |
| }, |
| handleSubmit (e) { |
| if (e && e.preventDefault) { |
| e.preventDefault() |
| } |
| if (this.loading) return |
| |
| this.$refs.formRef.validate().then((values) => { |
| const params = { |
| sourceofferingid: this.resource.id, |
| name: values.name |
| } |
| |
| if (values.displaytext) { |
| params.displaytext = values.displaytext |
| } |
| if (values.storagetype) { |
| params.storagetype = values.storagetype |
| } |
| if (values.writecachetype) { |
| params.cachemode = values.writecachetype |
| } |
| if (values.provisioningtype) { |
| params.provisioningtype = values.provisioningtype |
| } |
| if (values.customdisksize !== undefined) { |
| params.customized = values.customdisksize |
| } |
| if (values.disksizestrictness !== undefined) { |
| params.disksizestrictness = values.disksizestrictness |
| } |
| if (values.encryptdisk !== undefined) { |
| params.encrypt = values.encryptdisk |
| } |
| |
| if (values.customdisksize !== true && values.disksize) { |
| params.disksize = values.disksize |
| } |
| |
| if (values.qostype === 'storage') { |
| const customIops = values.iscustomizeddiskiops === true |
| params.customizediops = customIops |
| if (!customIops) { |
| if (values.diskiopsmin != null && values.diskiopsmin.length > 0) { |
| params.miniops = values.diskiopsmin |
| } |
| if (values.diskiopsmax != null && values.diskiopsmax.length > 0) { |
| params.maxiops = values.diskiopsmax |
| } |
| if (values.hypervisorsnapshotreserve != null && values.hypervisorsnapshotreserve.length > 0) { |
| params.hypervisorsnapshotreserve = values.hypervisorsnapshotreserve |
| } |
| } |
| } else if (values.qostype === 'hypervisor') { |
| if (values.diskbytesreadrate != null && values.diskbytesreadrate.length > 0) { |
| params.bytesreadrate = values.diskbytesreadrate |
| } |
| if (values.diskbytesreadratemax != null && values.diskbytesreadratemax.length > 0) { |
| params.bytesreadratemax = values.diskbytesreadratemax |
| } |
| if (values.diskbyteswriterate != null && values.diskbyteswriterate.length > 0) { |
| params.byteswriterate = values.diskbyteswriterate |
| } |
| if (values.diskbyteswriteratemax != null && values.diskbyteswriteratemax.length > 0) { |
| params.byteswriteratemax = values.diskbyteswriteratemax |
| } |
| if (values.diskiopsreadrate != null && values.diskiopsreadrate.length > 0) { |
| params.iopsreadrate = values.diskiopsreadrate |
| } |
| if (values.diskiopswriterate != null && values.diskiopswriterate.length > 0) { |
| params.iopswriterate = values.diskiopswriterate |
| } |
| } |
| |
| if (values.tags != null && values.tags.length > 0) { |
| const tags = values.tags.join(',') |
| params.tags = tags |
| } |
| |
| if (values.ispublic !== true) { |
| const domainIndexes = values.domainid |
| let domainId = null |
| if (domainIndexes && domainIndexes.length > 0) { |
| const domainIds = [] |
| const domains = this.$refs.formRef.domains |
| for (let i = 0; i < domainIndexes.length; i++) { |
| domainIds.push(domains[domainIndexes[i]].id) |
| } |
| domainId = domainIds.join(',') |
| } |
| if (domainId) { |
| params.domainid = domainId |
| } |
| } |
| |
| const zoneIndexes = values.zoneid |
| let zoneId = null |
| if (zoneIndexes && zoneIndexes.length > 0) { |
| const zoneIds = [] |
| const zones = this.$refs.formRef.zones |
| for (let j = 0; j < zoneIndexes.length; j++) { |
| zoneIds.push(zones[zoneIndexes[j]].id) |
| } |
| zoneId = zoneIds.join(',') |
| } |
| if (zoneId) { |
| params.zoneid = zoneId |
| } |
| |
| if (values.storagepolicy) { |
| params.storagepolicy = values.storagepolicy |
| } |
| |
| this.loading = true |
| postAPI('cloneDiskOffering', params).then(json => { |
| this.$message.success(`${this.$t('message.success.clone.disk.offering')} ${values.name}`) |
| this.$emit('refresh-data') |
| this.closeAction() |
| }).catch(error => { |
| this.$notifyError(error) |
| }).finally(() => { |
| this.loading = false |
| }) |
| }) |
| }, |
| closeAction () { |
| this.$emit('close-action') |
| } |
| } |
| } |
| </script> |
| |
| <style scoped lang="less"> |
| .form-layout { |
| width: 80vw; |
| |
| @media (min-width: 700px) { |
| width: 550px; |
| } |
| } |
| </style> |