CreateServer.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <template>
  2. <div class="severtemplate-create-server">
  3. <page-header :title="$t('compute.text_1039', [this.$t('dictionary.server')])" />
  4. <a-form :form="form.fc" class="mt-3" v-bind="formItemLayout">
  5. <a-form-item :label="$t('compute.text_228')" :extra="$t('compute.text_1040')">
  6. <a-input v-decorator="decorators.generate_name" :placeholder="$t('validator.resourceCreateName')" />
  7. </a-form-item>
  8. <a-form-item :label="$t('compute.text_294')">
  9. <a-input-number v-decorator="decorators.count" :min="1" :max="100" />
  10. </a-form-item>
  11. <a-form-item :label="$t('compute.text_1041')" v-if="isOpenWorkflow">
  12. <a-input v-decorator="decorators.reason" :placeholder="$t('compute.text_1042')" />
  13. </a-form-item>
  14. <page-footer>
  15. <template v-slot:right>
  16. <a-button
  17. type="primary"
  18. class="mr-2"
  19. @click="submit"
  20. style="width: 120px;"
  21. :loading="loading">{{ isOpenWorkflow ? $t('compute.text_288') : $t('dialog.ok') }}</a-button>
  22. <a-button style="width: 120px;" @click="goBack">{{$t('compute.text_135')}}</a-button>
  23. <side-errors :error-title="$t('compute.text_290')" :errors.sync="errors" />
  24. </template>
  25. </page-footer>
  26. </a-form>
  27. </div>
  28. </template>
  29. <script>
  30. import { GenCreateData } from '@Compute/utils/createServer'
  31. import WindowsMixin from '@/mixins/windows'
  32. import workflowMixin from '@/mixins/workflow'
  33. import { WORKFLOW_TYPES } from '@/constants/workflow'
  34. import SideErrors from '@/sections/SideErrors'
  35. export default {
  36. name: 'ServertemplateCreateServer',
  37. components: {
  38. SideErrors,
  39. },
  40. mixins: [WindowsMixin, workflowMixin],
  41. data () {
  42. return {
  43. loading: false,
  44. catalogData: {},
  45. serverConfig: null,
  46. project_id: '',
  47. project_domain: '',
  48. errors: {},
  49. form: {
  50. fc: this.$form.createForm(this),
  51. },
  52. decorators: {
  53. generate_name: [
  54. 'generate_name',
  55. {
  56. validateFirst: true,
  57. rules: [
  58. { required: true, message: this.$t('compute.text_1043') },
  59. { validator: this.$validate('resourceCreateName') },
  60. ],
  61. },
  62. ],
  63. count: [
  64. 'count',
  65. {
  66. initialValue: 1,
  67. validateFirst: true,
  68. rules: [
  69. { required: true, message: this.$t('compute.text_211') },
  70. ],
  71. },
  72. ],
  73. reason: [
  74. 'reason',
  75. ],
  76. },
  77. formItemLayout: {
  78. wrapperCol: {
  79. md: { span: 18 },
  80. xl: { span: 21 },
  81. xxl: { span: 22 },
  82. },
  83. labelCol: {
  84. md: { span: 6 },
  85. xl: { span: 3 },
  86. xxl: { span: 2 },
  87. },
  88. },
  89. }
  90. },
  91. computed: {
  92. isOpenWorkflow () {
  93. return this.checkWorkflowEnabled(WORKFLOW_TYPES.APPLY_MACHINE)
  94. },
  95. },
  96. created () {
  97. this.fetchServerConfig()
  98. },
  99. methods: {
  100. fetchServerConfig (id) {
  101. new this.$Manager('servertemplates', 'v2')
  102. .get({ id: this.$route.query.id })
  103. .then(({ data }) => {
  104. this.serverConfig = data.content
  105. this.project_id = data.tenant_id
  106. this.project_domain = data.project_domain
  107. })
  108. .catch(() => {
  109. this.$message.error(this.$t('compute.text_1044'))
  110. })
  111. },
  112. doCreateWorkflow (values) {
  113. const params = {
  114. ...this.serverConfig,
  115. generate_name: values.generate_name,
  116. __count__: values.count,
  117. }
  118. delete params.reason
  119. const variables = {
  120. process_definition_key: WORKFLOW_TYPES.APPLY_MACHINE,
  121. initiator: this.$store.getters.userInfo.id,
  122. description: values.reason,
  123. 'server-create-paramter': JSON.stringify(params),
  124. project: this.project_id,
  125. project_domain: this.project_domain,
  126. }
  127. // this._getProjectDomainInfo(variables) // !!! project_domain 暂时不加,因为后端可以从token里面获取
  128. return new this.$Manager('process-instances', 'v1')
  129. .create({ data: { variables } })
  130. .then(() => {
  131. this.$message.success(this.$t('compute.text_1045', [params.generate_name]))
  132. this.goWorkflow()
  133. })
  134. },
  135. async checkCreateData (fd) {
  136. try {
  137. const data = { generate_name: fd.generate_name, ...this.serverConfig, dry_run: true }
  138. const res = new this.$Manager('servers').create({ data })
  139. return res
  140. } catch (error) {
  141. throw error
  142. }
  143. },
  144. doForecast (fd) {
  145. const genCreateData = new GenCreateData()
  146. const params = {
  147. generate_name: fd.generate_name,
  148. __count__: fd.count,
  149. ...this.serverConfig,
  150. }
  151. return new this.$Manager('schedulers', 'v1').rpc({ methodname: 'DoForecast', params })
  152. .then(res => {
  153. if (res.data.can_create) {
  154. this.createServer(params)
  155. } else {
  156. this.errors = genCreateData.getForecastErrors(res.data)
  157. }
  158. })
  159. .catch(err => {
  160. this.$message.error(this.$t('compute.text_321', [err]))
  161. })
  162. },
  163. createServer (data) {
  164. delete data.vcpu_count
  165. delete data.vmem_size
  166. new this.$Manager('servers', 'v2').create({ data })
  167. .then(res => {
  168. this.$message.success(this.$t('compute.text_322'))
  169. this.goVminstance()
  170. })
  171. },
  172. async submit () {
  173. this.loading = true
  174. try {
  175. const values = await this.form.fc.validateFields()
  176. if (this.isOpenWorkflow) {
  177. await this.doCreateWorkflow(values)
  178. } else {
  179. await this.checkCreateData(values)
  180. await this.doForecast(values)
  181. }
  182. this.loading = false
  183. } catch (error) {
  184. this.loading = false
  185. throw error
  186. }
  187. },
  188. goWorkflow () {
  189. this.$router.push('/workflow')
  190. },
  191. goBack () {
  192. this.$router.push('/servertemplate')
  193. },
  194. goVminstance () {
  195. this.$router.push('/vminstance')
  196. },
  197. },
  198. }
  199. </script>
  200. <style lang="less" scoped>
  201. .severtemplate-create-server {
  202. ::v-deep .ant-form.ant-form-horizontal .ant-form-item .ant-form-item-label{
  203. padding-left: 20px;
  204. }
  205. }
  206. </style>