index.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. import { mount } from '@vue/test-utils'
  2. import * as R from 'ramda'
  3. import DataDisk from '../index'
  4. import { diskValidator } from '@Compute/utils/createServer'
  5. import Disk from '@Compute/sections/Disk'
  6. import { isRequired } from '@/utils/validate'
  7. import i18n from '@/locales'
  8. let decorator = null
  9. let store = null
  10. let setFieldsValue = null
  11. let getFieldsValue = null
  12. let wrapper = null
  13. const type = 'idc'
  14. const hypervisor = 'kvm'
  15. const sku = {
  16. attached_disk_count: 0,
  17. attached_disk_size_gb: 0,
  18. can_delete: false,
  19. can_update: true,
  20. cloudregion_id: 'default',
  21. cpu_core_count: 2,
  22. created_at: '2019-01-08T04:51:02.000000Z',
  23. data_disk_max_count: 0,
  24. deleted: false,
  25. enabled: true,
  26. gpu_attachable: true,
  27. gpu_count: 0,
  28. gpu_max_count: 0,
  29. id: '540445d3-83e4-4881-8c66-e58fec6b77e4',
  30. instance_type_category: 'general_purpose',
  31. instance_type_family: 'g1',
  32. is_emulated: false,
  33. local_category: 'general_purpose',
  34. memory_size_mb: 2048,
  35. name: 'ecs.g1.c2m2',
  36. nic_max_count: 1,
  37. os_name: 'Any',
  38. postpaid_status: 'available',
  39. prepaid_status: 'available',
  40. provider: 'OneCloud',
  41. region: 'Default',
  42. region_ext_id: '',
  43. status: 'ready',
  44. sys_disk_max_size_gb: 0,
  45. sys_disk_min_size_gb: 0,
  46. sys_disk_resizable: true,
  47. sys_disk_type: 'local',
  48. total_guest_count: 17,
  49. update_version: 3,
  50. updated_at: '2019-07-18T02:12:11.000000Z',
  51. }
  52. const capabilityData = {
  53. brands: ['Ceph', 'VMware', 'S3', 'OneCloud'],
  54. compute_engine_brands: ['VMware', 'OneCloud'],
  55. data_storage_types: ['rbd/rotate', 'local/rotate'],
  56. data_storage_types2: {
  57. baremetal: [],
  58. kvm: ['rbd/rotate', 'local/rotate'],
  59. },
  60. disabled_brands: [],
  61. disabled_compute_engine_brands: [],
  62. disabled_network_manage_brands: [],
  63. disabled_object_storage_brands: [],
  64. gpu_models: ['GeForce GTX 1050 Ti', 'Quadro FX 580'],
  65. hypervisors: ['baremetal', 'kvm'],
  66. max_data_disk_count: 12,
  67. max_nic_count: 8,
  68. min_data_disk_count: 0,
  69. min_nic_count: 1,
  70. network_manage_brands: ['OneCloud'],
  71. object_storage_brands: ['Ceph', 'S3'],
  72. public_network_count: 3,
  73. resource_types: ['shared'],
  74. sched_policy_support: true,
  75. specs: {
  76. hosts: {
  77. 'cpu:24/manufacture:LENOVO/mem:128738M/model:PC0169QS/nic:1': {
  78. count: 1,
  79. cpu: 24,
  80. manufacture: 'LENOVO',
  81. mem: 128738,
  82. model: 'PC0169QS',
  83. nic_count: 1,
  84. },
  85. 'cpu:40/manufacture:Hewlett-Packard/mem:257773M/model:HP Z820 Workstation/nic:1': {
  86. count: 2,
  87. cpu: 40,
  88. manufacture: 'Hewlett-Packard',
  89. mem: 257773,
  90. model: 'HP Z820 Workstation',
  91. nic_count: 1,
  92. },
  93. },
  94. isolated_devices: {
  95. 'model:Quadro FX 580/type:GPU-HPC/vendor:NVIDIA': {
  96. count: 1,
  97. dev_type: 'GPU-HPC',
  98. model: 'Quadro FX 580',
  99. pci_id: '10de:0659',
  100. vendor: 'NVIDIA',
  101. },
  102. },
  103. },
  104. storage_types: ['rbd/rotate', 'local/rotate'],
  105. storage_types2: { baremetal: [], kvm: ['rbd/rotate', 'local/rotate'] },
  106. usable: true,
  107. }
  108. beforeEach(() => {
  109. decorator = {
  110. type: i => [
  111. `dataDiskTypes[${i}]`,
  112. {
  113. rules: [
  114. { validator: isRequired(), message: i18n.t('compute.text_121') },
  115. ],
  116. },
  117. ],
  118. size: i => [
  119. `dataDiskSizes[${i}]`,
  120. {
  121. rules: [
  122. { required: true, message: i18n.t('compute.text_122') },
  123. ],
  124. },
  125. ],
  126. schedtag: i => [
  127. `dataDiskSchedtags[${i}]`,
  128. {
  129. validateTrigger: ['change', 'blur'],
  130. rules: [{
  131. required: true,
  132. message: i18n.t('compute.text_123'),
  133. }],
  134. },
  135. ],
  136. policy: i => [
  137. `dataDiskPolicys[${i}]`,
  138. {
  139. validateTrigger: ['blur', 'change'],
  140. rules: [{
  141. required: true,
  142. message: i18n.t('compute.text_123'),
  143. }],
  144. },
  145. ],
  146. snapshot: i => [
  147. `dataDiskSnapshots[${i}]`,
  148. {
  149. validateTrigger: ['blur', 'change'],
  150. rules: [{
  151. required: true,
  152. message: i18n.t('compute.text_124'),
  153. }],
  154. },
  155. ],
  156. filetype: i => [
  157. `dataDiskFiletypes[${i}]`,
  158. {
  159. validateTrigger: ['blur', 'change'],
  160. rules: [{
  161. required: true,
  162. message: i18n.t('compute.text_125'),
  163. }],
  164. },
  165. ],
  166. mountPath: i => [
  167. `dataDiskMountPaths[${i}]`,
  168. {
  169. validateTrigger: ['blur', 'change'],
  170. rules: [{
  171. required: true,
  172. message: i18n.t('compute.text_126'),
  173. }, {
  174. validator: diskValidator,
  175. }],
  176. },
  177. ],
  178. }
  179. store = {
  180. getters: {
  181. isAdminMode: () => true,
  182. scope: () => 'system',
  183. },
  184. }
  185. setFieldsValue = jest.fn()
  186. getFieldsValue = jest.fn()
  187. wrapper = mount(DataDisk, {
  188. propsData: {
  189. decorator,
  190. type,
  191. hypervisor,
  192. sku,
  193. capabilityData,
  194. },
  195. provide () {
  196. return {
  197. form: {
  198. fc: {
  199. setFieldsValue,
  200. getFieldsValue,
  201. },
  202. },
  203. }
  204. },
  205. store,
  206. })
  207. })
  208. expect.extend({
  209. haveSizeAndType (obj) {
  210. const result = {
  211. message: () => '',
  212. pass: true,
  213. }
  214. const keys = Object.keys(obj)
  215. const valid = keys.every(k => {
  216. const val = obj[k]
  217. if (k.startsWith('dataDiskSizes')) {
  218. return R.is(Number, val) && val >= 10
  219. }
  220. if (k.startsWith('dataDiskTypes')) {
  221. return R.is(Object, val) && !R.isEmpty(val.key)
  222. }
  223. return true
  224. })
  225. if (!valid) {
  226. result.pass = false
  227. result.message = () => i18n.t('compute.text_127', [JSON.stringify(obj)])
  228. }
  229. return result
  230. },
  231. })
  232. describe('DataDisk kvm', () => {
  233. it('check add once', () => {
  234. wrapper.vm.add()
  235. wrapper.vm.$nextTick(() => {
  236. expect(setFieldsValue.mock.instances[0].setFieldsValue).toHaveBeenCalled()
  237. expect(setFieldsValue.mock.calls[0][0]).haveSizeAndType()
  238. expect(wrapper.vm.$el).toMatchSnapshot()
  239. })
  240. })
  241. it('check add twice', () => {
  242. wrapper.vm.add()
  243. wrapper.vm.add()
  244. wrapper.vm.$nextTick(() => {
  245. expect(setFieldsValue.mock.instances[0].setFieldsValue).toHaveBeenCalled()
  246. expect(setFieldsValue.mock.calls[0][0]).haveSizeAndType()
  247. expect(setFieldsValue.mock.calls[1][0]).haveSizeAndType()
  248. expect(wrapper.vm.$el).toMatchSnapshot()
  249. })
  250. })
  251. it('check add twice and decrease once', () => {
  252. wrapper.vm.add()
  253. wrapper.vm.add()
  254. const firstKey = wrapper.vm.dataDisks[0].key
  255. const secondKey = wrapper.vm.dataDisks[1].key
  256. wrapper.vm.decrease(firstKey)
  257. expect(wrapper.vm.dataDisks[0].key).toBe(secondKey)
  258. })
  259. it('check diskTypeChange', () => {
  260. wrapper.vm.add()
  261. wrapper.vm.add()
  262. wrapper.find(Disk).vm.$emit('diskTypeChange', {
  263. key: 'rbd',
  264. label: 'Ceph RBD',
  265. })
  266. wrapper.vm.$nextTick(() => {
  267. expect(wrapper.vm.dataDisks[0].diskType.key).toBe('rbd')
  268. expect(wrapper.vm.$el).toMatchSnapshot()
  269. })
  270. })
  271. // 如果磁盘类别里面有本地磁盘,优先本地磁盘作为第一项
  272. it('check add once, diskType is local', () => {
  273. if (wrapper.vm.typesMap.local) {
  274. expect(Object.keys(wrapper.vm.typesMap)[0]).toBe('local')
  275. }
  276. })
  277. })