IDC.vue 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. <template>
  2. <div>
  3. <a-form
  4. class="mt-3"
  5. v-bind="formItemLayout"
  6. :form="form.fc"
  7. hideRequiredMark>
  8. <a-form-item :label="$t('storage.text_55', [$t('dictionary.project')])">
  9. <domain-project :fc="form.fc" :decorators="{ project: decorators.project, domain: decorators.domain }" />
  10. </a-form-item>
  11. <a-form-item :label="$t('storage.text_40')">
  12. <a-input v-decorator="decorators.name" />
  13. <template v-slot:extra>
  14. <name-repeated res="file_systems" :name="form.fd.name" :default-text="$t('compute.text_893')" />
  15. </template>
  16. </a-form-item>
  17. <a-form-item :label="$t('common.description')">
  18. <a-textarea :auto-size="{ minRows: 1, maxRows: 3 }" v-decorator="decorators.description" :placeholder="$t('common_367')" />
  19. </a-form-item>
  20. <area-selects
  21. class="mb-0"
  22. ref="areaSelects"
  23. :wrapperCol="formItemLayout.wrapperCol"
  24. :labelCol="formItemLayout.labelCol"
  25. :names="areaselectsName"
  26. :cloudregionParams="param.region"
  27. :zoneParams="param.zone"
  28. :providerParams="param.provider"
  29. :isRequired="true"
  30. filterBrandResource="compute_engine"
  31. @change="handleRegionChange" />
  32. <a-form-item :label="$t('compute.text_15')" required v-bind="formItemLayout">
  33. <base-select
  34. class="w-50"
  35. v-decorator="decorators.cloudprovider"
  36. resource="cloudproviders"
  37. :params="cloudproviderParams"
  38. :mapper="providerMapper"
  39. :isDefaultSelect="true"
  40. :showSync="true"
  41. :select-props="{ placeholder: $t('common.tips.select', [$t('compute.text_653')]) }" />
  42. </a-form-item>
  43. <a-form-item :label="$t('storage.capacity')">
  44. <a-input-number v-decorator="decorators.capacity_gb" :min="1" :step="1" :precision="0" /> GB
  45. </a-form-item>
  46. <a-form-item :label="$t('compute.text_1154')" class="mb-0">
  47. <tag
  48. v-decorator="decorators.tag" :allowNoValue="false" />
  49. </a-form-item>
  50. <bottom-bar
  51. :values="form.fc.getFieldsValue()"
  52. @submit="handleConfirm"
  53. @cancel="handleCancel" />
  54. </a-form>
  55. </div>
  56. </template>
  57. <script>
  58. import DomainProject from '@/sections/DomainProject'
  59. import { formItemLayout } from '@Storage/constants'
  60. import AreaSelects from '@/sections/AreaSelects'
  61. import Tag from '@/sections/Tag'
  62. import validateForm, { isRequired } from '@/utils/validate'
  63. import BottomBar from '../components/BottomBar'
  64. import fsCreateMixin from './mixin'
  65. export default {
  66. name: 'FileSystemIDCCreate',
  67. components: {
  68. DomainProject,
  69. AreaSelects,
  70. Tag,
  71. BottomBar,
  72. },
  73. mixins: [fsCreateMixin],
  74. data () {
  75. return {
  76. formItemLayout,
  77. areaselectsName: ['cloudregion', 'zone'],
  78. regionList: [],
  79. zoneList: [],
  80. decorators: {
  81. domain: [
  82. 'domain',
  83. {
  84. rules: [
  85. { validator: isRequired(), message: this.$t('rules.domain'), trigger: 'change' },
  86. ],
  87. },
  88. ],
  89. project: [
  90. 'project',
  91. {
  92. rules: [
  93. { validator: isRequired(), message: this.$t('rules.project'), trigger: 'change' },
  94. ],
  95. },
  96. ],
  97. name: [
  98. 'name',
  99. {
  100. validateFirst: true,
  101. rules: [
  102. { required: true, message: this.$t('network.text_218') },
  103. { validator: validateForm('serverName') },
  104. ],
  105. },
  106. ],
  107. description: ['description'],
  108. cloudregion: [
  109. 'cloudregion',
  110. {
  111. initialValue: { key: '', label: '' },
  112. rules: [
  113. { validator: isRequired(), message: this.$t('network.text_286') },
  114. ],
  115. },
  116. ],
  117. zone: [
  118. 'zone',
  119. {
  120. initialValue: { key: '', label: '' },
  121. rules: [
  122. { required: true, message: this.$t('storage.text_58') },
  123. ],
  124. },
  125. ],
  126. cloudprovider: [
  127. 'cloudprovider',
  128. {
  129. rules: [
  130. { required: true, message: this.$t('common.tips.select', [this.$t('compute.text_653')]) },
  131. ],
  132. },
  133. ],
  134. capacity_gb: [
  135. 'capacity_gb',
  136. {
  137. initialValue: 1,
  138. },
  139. ],
  140. tag: [
  141. 'tag',
  142. {
  143. rules: [
  144. { validator: validateForm('tagName') },
  145. ],
  146. },
  147. ],
  148. },
  149. }
  150. },
  151. computed: {
  152. param () {
  153. const project_domain = { project_domain: this.form.fd.domain?.key || this.userInfo.projectDomainId || this.userInfo.domain.id }
  154. const params = {
  155. zone: {
  156. usable: true,
  157. show_emulated: true,
  158. order_by: 'created_at',
  159. order: 'asc',
  160. ...project_domain,
  161. },
  162. region: {
  163. usable: true,
  164. cloud_env: 'onpremise',
  165. show_emulated: true,
  166. ...project_domain,
  167. },
  168. provider: {},
  169. }
  170. return params
  171. },
  172. cloudproviderParams () {
  173. const params = {
  174. limit: 0,
  175. enabled: 1,
  176. details: true,
  177. scope: this.scope,
  178. read_only: false,
  179. cloudregion: this.form.fd.cloudregion,
  180. }
  181. if (this.isAdminMode) {
  182. params.admin = true
  183. params.project_domain = this.form.fd.domain?.key
  184. delete params.scope
  185. delete params.domain_id
  186. }
  187. return params
  188. },
  189. },
  190. methods: {
  191. providerMapper (data) {
  192. if (this.cloudEnv === 'onpremise') data = data.filter(item => item.provider !== 'VMware')
  193. return data
  194. },
  195. handleRegionChange (val) {
  196. if (val.cloudregion) {
  197. this.form.fc.setFieldsValue({
  198. cloudregion: val.cloudregion.id,
  199. })
  200. }
  201. if (val.zone) {
  202. this.form.fc.setFieldsValue({
  203. zone: val.zone.id,
  204. })
  205. }
  206. },
  207. async handleConfirm () {
  208. this.loading = true
  209. try {
  210. const values = await this.form.fc.validateFields()
  211. const { name, project, domain, cloudprovider, capacity_gb, tag, ...rest } = values
  212. await new this.$Manager('file_systems').create({
  213. data: {
  214. ...rest,
  215. generate_name: name,
  216. __meta__: tag,
  217. project_domain: (domain && domain.key) || this.userInfo.projectDomainId,
  218. project_id: (project && project.key) || this.userInfo.projectId,
  219. cloudregion: this.form.fd.cloudregion,
  220. zone_id: this.form.fd.zone,
  221. manager_id: cloudprovider,
  222. file_system_type: 'standard',
  223. protocol: 'CephFS',
  224. storage_type: 'capacity',
  225. capacity: capacity_gb,
  226. },
  227. })
  228. this.$message.success(this.$t('network.nat.create.success'))
  229. this.$router.push('/nas')
  230. } catch (error) {
  231. throw error
  232. } finally {
  233. this.loading = false
  234. }
  235. },
  236. },
  237. }
  238. </script>
  239. <style>
  240. </style>