Form.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <template>
  2. <div class="w-75">
  3. <a-form :form="form.fc" v-bind="formItemLayout">
  4. <a-form-item :label="$t('k8s.text_41')">
  5. <a-input :placeholder="$t('k8s.text_60')" v-decorator="decorators.name" />
  6. </a-form-item>
  7. <a-form-item :label="$t('k8s.text_19')">
  8. <cluster-select v-decorator="decorators.cluster" @input="setCluster" :clusterObj.sync="clusterObj" />
  9. </a-form-item>
  10. <a-form-item :label="$t('k8s.text_23')">
  11. <namespace-select v-decorator="decorators.namespace" @input="setNamespace" :cluster="cluster" :namespaceObj.sync="namespaceObj" />
  12. </a-form-item>
  13. <a-form-item :label="$t('k8s.text_229')">
  14. <a-input-number v-decorator="decorators.replicas" :min="1" :max="10" />
  15. </a-form-item>
  16. <a-form-item :label="$t('k8s.text_220')">
  17. <image-secret
  18. :form="form"
  19. :decorators="decorators.imageSecrets"
  20. :namespace="namespaceObj.name"
  21. :cluster="cluster" />
  22. </a-form-item>
  23. <a-form-item :label="$t('k8s.text_13')">
  24. <port-mapping
  25. :form="form"
  26. :decorators="decorators.portMappings"
  27. :cluster-obj="clusterObj" />
  28. </a-form-item>
  29. <a-form-item :label="$t('k8s.text_221')">
  30. <restart-policy-select
  31. :decorator="decorators.restartPolicy"
  32. type="statefulset" />
  33. </a-form-item>
  34. <a-collapse :bordered="false" class="mb-3">
  35. <a-collapse-panel :header="$t('k8s.text_223')" key="1">
  36. <a-form-item :label="$t('k8s.text_82')">
  37. <labels :decorators="decorators.labels" />
  38. </a-form-item>
  39. <a-form-item :label="$t('k8s.text_224')">
  40. <labels :decorators="decorators.annotations" :title="$t('k8s.text_224')" />
  41. </a-form-item>
  42. </a-collapse-panel>
  43. </a-collapse>
  44. <spec-container
  45. :form="form"
  46. :panes.sync="containerPanes"
  47. :errPanes="errPanes"
  48. :decorators="decorators.containers"
  49. :namespace="namespaceObj.name"
  50. :cluster="cluster" />
  51. </a-form>
  52. </div>
  53. </template>
  54. <script>
  55. import * as R from 'ramda'
  56. import ClusterSelect from '@K8S/sections/ClusterSelect'
  57. import NamespaceSelect from '@K8S/sections/NamespaceSelect'
  58. import ImageSecret from '@K8S/sections/ImageSecret'
  59. import PortMapping from '@K8S/sections/PortMapping'
  60. import RestartPolicySelect from '@K8S/sections/RestartPolicySelect'
  61. import Labels from '@K8S/sections/Labels'
  62. import SpecContainer from '@K8S/sections/SpecContainer'
  63. import { getSpecContainerParams, getLabels, getCreateDecorators, getServiceCreateParams } from '@K8S/utils'
  64. import k8sCreateMixin from '@K8S/mixins/create'
  65. export default {
  66. name: 'K8sStatefulsetCreate',
  67. components: {
  68. ClusterSelect,
  69. NamespaceSelect,
  70. ImageSecret,
  71. PortMapping,
  72. RestartPolicySelect,
  73. Labels,
  74. SpecContainer,
  75. },
  76. mixins: [k8sCreateMixin],
  77. data () {
  78. return {
  79. form: {
  80. fc: this.$form.createForm(this),
  81. },
  82. formItemLayout: {
  83. labelCol: { span: 4 },
  84. wrapperCol: { span: 20 },
  85. },
  86. errPanes: [], // 表单校验错误的tabs
  87. containerPanes: [], // 子组件同步的tabs
  88. decorators: getCreateDecorators.call(this, 'statefulset'),
  89. clusterObj: {},
  90. namespaceObj: {},
  91. }
  92. },
  93. methods: {
  94. validateForm () {
  95. return new Promise((resolve, reject) => {
  96. this.form.fc.validateFieldsAndScroll({ scroll: { alignWithTop: true, offsetTop: 100 } }, (err, values) => {
  97. if (!err) {
  98. resolve(values)
  99. } else {
  100. this.setErrorPane(err)
  101. reject(err)
  102. }
  103. })
  104. })
  105. },
  106. setErrorPane (err) {
  107. const keys = Object.keys(err).filter(v => v.startsWith('container'))
  108. const containerErrValues = keys.map(k => err[k])
  109. const errPanes = containerErrValues.map(v => Object.keys(v)).flat()
  110. this.errPanes = Array.from(new Set(errPanes))
  111. },
  112. async _doCreate (data) {
  113. await new this.$Manager('statefulsets', 'v1').create({ data })
  114. },
  115. async doCreate () {
  116. try {
  117. const values = await this.validateForm()
  118. const spec = getSpecContainerParams(values, this.containerPanes)
  119. const labels = getLabels(values, 'labelKeys', 'labelValues')
  120. const annotations = getLabels(values, 'annotationsKeys', 'annotationsValues')
  121. const service = getServiceCreateParams(values)
  122. const template = {
  123. spec: {
  124. volumes: spec.volumes,
  125. containers: spec.containers,
  126. imagePullSecrets: values.imagePullSecrets,
  127. restartPolicy: values.restartPolicy,
  128. },
  129. }
  130. const params = {
  131. name: values.name,
  132. cluster: values.cluster,
  133. namespace: values.namespace,
  134. replicas: values.replicas,
  135. labels,
  136. annotations,
  137. template,
  138. }
  139. if (!R.isEmpty(service)) params.service = service
  140. await this._doCreate(params)
  141. this.$message.success(this.$t('k8s.text_46'))
  142. } catch (error) {
  143. throw error
  144. }
  145. },
  146. },
  147. }
  148. </script>