index.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <template>
  2. <div>
  3. <page-header :title="$t('k8s.text_177')" />
  4. <a-form
  5. class="mt-3"
  6. :form="form.fc">
  7. <a-form-item
  8. :label="$t('k8s.text_412')"
  9. v-bind="formItemLayout">
  10. <base-select
  11. v-if="isAdminMode"
  12. v-decorator="decorators.project_domain_id"
  13. resource="domains"
  14. version="v1"
  15. :params="domainParams"
  16. is-default-select
  17. filterable />
  18. <div v-else>{{ userInfo.projectDomain }}</div>
  19. </a-form-item>
  20. <a-form-item
  21. :label="$t('k8s.text_41')"
  22. v-bind="formItemLayout">
  23. <a-input v-decorator="decorators.name" :placeholder="$t('k8s.text_60')" />
  24. </a-form-item>
  25. <a-form-item :label="$t('k8s.text_401')" v-bind="formItemLayout">
  26. <icon-radio v-decorator="decorators.distribution" :options="clusterTypesOpt" />
  27. </a-form-item>
  28. <a-form-item
  29. :label="$t('k8s.text_181')"
  30. v-bind="formItemLayout">
  31. <code-mirror v-decorator="decorators.kubeconfig" :options="cmOptions" />
  32. </a-form-item>
  33. <a-form-item :wrapper-col="offsetWrapperCol">
  34. <a-button class="mr-2" type="primary" @click="doImport" :loading="loading">{{$t('k8s.text_143')}}</a-button>
  35. <a-button @click="cancel">{{$t('k8s.text_162')}}</a-button>
  36. </a-form-item>
  37. </a-form>
  38. </div>
  39. </template>
  40. <script>
  41. import { mapGetters } from 'vuex'
  42. import { validateYaml } from '@/utils/validate'
  43. import IconRadio from '@/sections/IconRadio'
  44. export default {
  45. name: 'ClusterImport',
  46. components: {
  47. IconRadio,
  48. },
  49. data () {
  50. const validator = (rule, value, _callback) => {
  51. validateYaml(value)
  52. .then(() => {
  53. return _callback()
  54. })
  55. .catch(() => {
  56. return _callback(this.$t('k8s.text_182'))
  57. })
  58. }
  59. const clusterTypesOpt = [
  60. { key: 'k8s', label: 'K8S', icon: { type: 'k8s' }, style: { color: 'rgb(50, 109, 230)' } },
  61. { key: 'openshift', label: 'OpenShift', icon: { type: 'openshift' }, style: { color: 'rgb(225, 38, 52)' } },
  62. ]
  63. return {
  64. loading: false,
  65. form: {
  66. fc: this.$form.createForm(this),
  67. },
  68. decorators: {
  69. project_domain_id: [
  70. 'project_domain_id',
  71. {
  72. rules: [
  73. { required: true, message: this.$t('k8s.text_413') },
  74. ],
  75. },
  76. ],
  77. name: [
  78. 'name',
  79. {
  80. validateTrigger: 'blur',
  81. rules: [
  82. { required: true, message: this.$t('k8s.text_60') },
  83. ],
  84. },
  85. ],
  86. distribution: [
  87. 'distribution',
  88. {
  89. initialValue: clusterTypesOpt[0].key,
  90. },
  91. ],
  92. kubeconfig: [
  93. 'kubeconfig',
  94. {
  95. validateFirst: true,
  96. rules: [
  97. { required: true, message: this.$t('k8s.text_183') },
  98. { validator },
  99. ],
  100. },
  101. ],
  102. },
  103. formItemLayout: {
  104. wrapperCol: {
  105. md: { span: 16 },
  106. xl: { span: 18 },
  107. xxl: { span: 20 },
  108. },
  109. labelCol: {
  110. md: { span: 8 },
  111. xl: { span: 6 },
  112. xxl: { span: 4 },
  113. },
  114. },
  115. offsetWrapperCol: {
  116. md: { span: 16, offset: 8 },
  117. xl: { span: 18, offset: 6 },
  118. xxl: { span: 20, offset: 4 },
  119. },
  120. cmOptions: {
  121. tabSize: 2,
  122. styleActiveLine: true,
  123. lineNumbers: true,
  124. line: true,
  125. mode: 'text/x-yaml',
  126. theme: 'material',
  127. autofocus: true,
  128. },
  129. clusterTypesOpt,
  130. }
  131. },
  132. computed: {
  133. ...mapGetters(['isAdminMode', 'userInfo', 'scope']),
  134. domainParams () {
  135. return {
  136. scope: this.scope,
  137. limit: 0,
  138. }
  139. },
  140. },
  141. methods: {
  142. async doImport () {
  143. this.loading = true
  144. try {
  145. const values = await this.form.fc.validateFields()
  146. const data = {
  147. mode: 'import',
  148. provider: 'external',
  149. resource_type: 'unknown',
  150. name: values.name,
  151. project_domain_id: this.isAdminMode ? values.project_domain_id : this.userInfo.domain?.id,
  152. import_data: {
  153. kubeconfig: values.kubeconfig,
  154. },
  155. }
  156. if (values.distribution === 'openshift') {
  157. data.import_data.distribution = 'openshift'
  158. }
  159. await new this.$Manager('kubeclusters', 'v1').create({ data })
  160. this.loading = false
  161. this.$message.success(this.$t('k8s.text_184'))
  162. this.cancel()
  163. } catch (error) {
  164. this.loading = false
  165. }
  166. },
  167. cancel () {
  168. this.$router.push('/k8s-cluster')
  169. },
  170. },
  171. }
  172. </script>