index.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <template>
  2. <div class="k8s-deployment-create 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_23')">
  8. <base-select
  9. resource="federatednamespaces"
  10. version="v1"
  11. @change="v => federatednamespaceId = v"
  12. v-decorator="decorators.federatednamespace"
  13. :params="federatednamespaceParams" />
  14. </a-form-item>
  15. <a-form-item :label="$t('k8s.text_389')">
  16. <a-radio-group v-decorator="decorators.roleRefType" @change="e => roleRefType = e.target.value">
  17. <a-radio-button v-for="item in roleRefOpts" :value="item.key" :key="item.key">{{ item.label }}</a-radio-button>
  18. </a-radio-group>
  19. </a-form-item>
  20. <a-form-item :label="roleLabel">
  21. <base-select
  22. :resource="roleRefType === 'Role' ? 'federatedroles' : 'federatedclusterroles'"
  23. version="v1"
  24. :params="params"
  25. need-params
  26. idKey="name"
  27. :select-props="{ placeholder: $t('common.select') }"
  28. v-decorator="decorators.role" />
  29. </a-form-item>
  30. <a-form-item label="Subject">
  31. <a-radio-group v-decorator="decorators.subjectType" @change="subjectTypeChange">
  32. <a-radio-button v-for="item in subjectTypeOpts" :value="item.key" :key="item.key">{{ item.label }}</a-radio-button>
  33. </a-radio-group>
  34. </a-form-item>
  35. <a-form-item label="Subject Name">
  36. <base-select
  37. v-if="subjectOpts.length"
  38. v-decorator="decorators.subject"
  39. :options="subjectOpts"
  40. version="v1"
  41. idKey="name"
  42. :select-props="{ placeholder: $t('common.select') }" />
  43. <a-input v-else v-decorator="decorators.subject" :placeholder="$t('common.placeholder')" />
  44. </a-form-item>
  45. </a-form>
  46. </div>
  47. </template>
  48. <script>
  49. import k8sCreateMixin from '@K8S/mixins/create'
  50. const API_GROUP = 'rbac.authorization.k8s.io'
  51. export default {
  52. name: 'K8sFederatedrolebindingFormCreate',
  53. components: {
  54. },
  55. mixins: [k8sCreateMixin],
  56. data () {
  57. return {
  58. form: {
  59. fc: this.$form.createForm(this),
  60. },
  61. formItemLayout: {
  62. labelCol: { span: 4 },
  63. wrapperCol: { span: 20 },
  64. },
  65. decorators: {
  66. name: [
  67. 'name',
  68. {
  69. validateFirst: true,
  70. rules: [
  71. { required: true, message: this.$t('k8s.text_60') },
  72. { min: 2, max: 24, message: this.$t('k8s.text_132'), trigger: 'blur' },
  73. { validator: this.$validate('k8sName') },
  74. ],
  75. },
  76. ],
  77. cluster: [
  78. 'cluster',
  79. {
  80. initialValue: this.$store.state.common.k8s.cluster,
  81. rules: [
  82. { required: true, message: this.$t('k8s.text_30'), trigger: 'blur' },
  83. ],
  84. },
  85. ],
  86. federatednamespace: [
  87. 'federatednamespace',
  88. {
  89. rules: [
  90. { required: true, message: this.$t('k8s.text_61'), trigger: 'blur' },
  91. ],
  92. },
  93. ],
  94. roleRefType: [
  95. 'roleRefType',
  96. {
  97. initialValue: 'Role',
  98. },
  99. ],
  100. role: [
  101. 'role',
  102. {
  103. rules: [
  104. { required: true, message: this.$t('common.select'), trigger: 'blur' },
  105. ],
  106. },
  107. ],
  108. subjectType: [
  109. 'subjectType',
  110. {
  111. initialValue: 'User',
  112. },
  113. ],
  114. subject: [
  115. 'subject',
  116. {
  117. rules: [
  118. { required: true, message: this.$t('common.select'), trigger: 'blur' },
  119. ],
  120. },
  121. ],
  122. },
  123. roleRefOpts: [
  124. { key: 'Role', label: this.$t('k8s.text_370') },
  125. { key: 'ClusterRole', label: this.$t('k8s.text_373') },
  126. ],
  127. subjectTypeOpts: [
  128. { key: 'User', label: 'User' },
  129. { key: 'Group', label: 'Group' },
  130. ],
  131. subjectOpts: [],
  132. roleRefType: 'Role',
  133. subjectType: 'User',
  134. federatednamespaceParams: {
  135. scope: this.$store.getters.scope,
  136. limit: 0,
  137. },
  138. federatednamespaceId: undefined,
  139. }
  140. },
  141. computed: {
  142. roleLabel () {
  143. return this.roleRefType === 'Role' ? this.$t('k8s.text_370') : this.$t('k8s.text_373')
  144. },
  145. params () {
  146. const params = {
  147. limit: 0,
  148. scope: this.$store.getters.scope,
  149. }
  150. if (this.roleRefType === 'Role' && this.federatednamespaceId) {
  151. params.federatednamespace_id = this.federatednamespaceId
  152. }
  153. return params
  154. },
  155. },
  156. created () {
  157. this.getSubjectOpts()
  158. },
  159. methods: {
  160. async getSubjectOpts () {
  161. try {
  162. let spec = ''
  163. if (this.subjectType === 'User') spec = 'cluster-users'
  164. if (this.subjectType === 'Group') spec = 'cluster-user-groups'
  165. const { data } = await new this.$Manager('federatedroles', 'v1').get({ id: spec, params: { scope: this.$store.getters.scope } })
  166. this.subjectOpts = data
  167. } catch (error) {
  168. throw error
  169. }
  170. },
  171. subjectTypeChange (e) {
  172. this.subjectType = e.target.value
  173. this.getSubjectOpts()
  174. this.form.fc.setFieldsValue({
  175. [this.decorators.subject[0]]: undefined,
  176. })
  177. },
  178. async validateForm () {
  179. try {
  180. const values = await this.form.fc.validateFields()
  181. const subjects = [{
  182. kind: values.subjectType,
  183. name: values.subject,
  184. apiGroup: API_GROUP,
  185. namespace: values.federatednamespace,
  186. }]
  187. const data = {
  188. name: values.name,
  189. federatednamespace_id: values.federatednamespace,
  190. spec: {
  191. template: {
  192. roleRef: {
  193. kind: values.roleRefType,
  194. name: values.role,
  195. apiGroup: API_GROUP,
  196. },
  197. subjects,
  198. },
  199. },
  200. }
  201. return data
  202. } catch (error) {
  203. throw error
  204. }
  205. },
  206. async doCreate () {
  207. try {
  208. const values = await this.validateForm()
  209. this.$emit('submit', values)
  210. } catch (error) {
  211. throw error
  212. }
  213. },
  214. },
  215. }
  216. </script>