columns.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. import { SERVER_TYPE } from '@Compute/constants'
  2. import {
  3. getProjectTableColumn,
  4. getRegionTableColumn,
  5. getStatusTableColumn,
  6. getBrandTableColumn,
  7. getCopyWithContentTableColumn,
  8. getIpsTableColumn,
  9. getNameDescriptionTableColumn,
  10. getTagTableColumn,
  11. getBillingTableColumn,
  12. getTimeTableColumn,
  13. getOsArch,
  14. } from '@/utils/common/tableColumn'
  15. import { sizestr } from '@/utils/utils'
  16. import { findPlatform, typeClouds } from '@/utils/common/hypervisor'
  17. import i18nLocale from '@/locales'
  18. import { HYPERVISORS_MAP } from '@/constants'
  19. export default {
  20. data () {
  21. return {
  22. columns: [],
  23. }
  24. },
  25. created () {
  26. this.serverManager = new this.$Manager('servers')
  27. const doCreateOrSwitchBackup = (obj) => {
  28. this.execLoading = true
  29. this.serverManager.performAction({
  30. id: obj.id,
  31. action: 'reconcile-backup',
  32. data: {},
  33. }).then((res) => {
  34. this.execLoading = false
  35. this.$message.success(this.$t('message.exec_success'))
  36. }).catch((err) => {
  37. this.execLoading = false
  38. this.$message.success(this.$t('message.exec_fail'))
  39. throw err
  40. })
  41. }
  42. const getToolTip = (row) => {
  43. const num = row.metadata.create_backup_count || row.metadata.switch_backup_count
  44. let time = row.metadata.create_backup || row.metadata.switch_backup
  45. if (time) {
  46. const aLink = <a-button type="link" class="oc-pointer" disabled={this.execLoading} style="padding: 0;" onClick={() => doCreateOrSwitchBackup(row)}>{this.$t('compute.text_1341')}</a-button>
  47. const aIcon = <a-icon type="exclamation-circle" class="ml-1 error-color oc-pointer" />
  48. try {
  49. time = this.$moment(JSON.parse(time)).format()
  50. } catch (error) {
  51. throw new Error('Failed to parse date', error)
  52. }
  53. if (row.metadata.create_backup) {
  54. return <a-tooltip placement="right">
  55. <template slot="title">
  56. <i18n path="compute.text_1342">
  57. <template slot="num">{num}</template>
  58. <template slot="time">{time}</template>
  59. <template slot="link">{aLink}</template>
  60. </i18n>
  61. </template>
  62. {aIcon}
  63. </a-tooltip>
  64. } else if (row.metadata.switch_backup) {
  65. return <a-tooltip placement="right">
  66. <template slot="title">
  67. <i18n path="compute.text_1343">
  68. <template slot="num">{num}</template>
  69. <template slot="time">{time}</template>
  70. <template slot="link">{aLink}</template>
  71. </i18n>
  72. </template>
  73. {aIcon}
  74. </a-tooltip>
  75. }
  76. }
  77. return null
  78. }
  79. const columns = [
  80. getNameDescriptionTableColumn({
  81. onManager: this.onManager,
  82. hideField: true,
  83. addLock: true,
  84. addEncrypt: true,
  85. addBackup: true,
  86. formRules: [
  87. { required: true, message: i18nLocale.t('compute.text_210') },
  88. // { validator: this.$validate('resourceCreateName') },
  89. ],
  90. statusModule: 'container',
  91. slotCallback: row => {
  92. return (
  93. <side-page-trigger onTrigger={() => this.handleOpenSidepage(row)}>{row.name}</side-page-trigger>
  94. )
  95. },
  96. hidden: () => {
  97. return this.$isScopedPolicyMenuHidden('server_hidden_columns.name')
  98. },
  99. }),
  100. getStatusTableColumn({
  101. minWidth: 180,
  102. statusModule: 'container',
  103. slotCallback: row => {
  104. const log = <side-page-trigger class="ml-1" onTrigger={() => this.handleOpenSidepage(row, 'event-drawer')}>{this.$t('common.view_logs')}</side-page-trigger>
  105. return [
  106. <div class='d-flex align-items-center text-truncate'>
  107. <status status={row.status} statusModule='container' process={row.progress} />
  108. {row.metadata && getToolTip(row)}
  109. {row.status?.includes('fail') ? log : null}
  110. </div>,
  111. ]
  112. },
  113. hidden: () => {
  114. return this.$isScopedPolicyMenuHidden('server_hidden_columns.status')
  115. },
  116. }),
  117. getStatusTableColumn({
  118. field: 'power_states',
  119. title: this.$t('compute.power_states'),
  120. statusModule: 'container',
  121. hidden: () => {
  122. return this.$isScopedPolicyMenuHidden('server_hidden_columns.power_states')
  123. },
  124. }),
  125. {
  126. field: 'is_gpu',
  127. title: i18nLocale.t('table.title.type'),
  128. width: 50,
  129. slots: {
  130. default: ({ row }) => {
  131. let tooltip = i18nLocale.t('compute.text_291', [i18nLocale.t('dictionary.server')])
  132. let icontype = 'cpu'
  133. if (row.is_gpu) {
  134. tooltip = `${this.$t('compute.text_113')}${this.$t('dictionary.server')}`
  135. icontype = 'gpu'
  136. }
  137. if (row.backup_host_id) {
  138. tooltip = this.$t('compute.backup')
  139. icontype = 'gaokeyong'
  140. }
  141. return [<icon type={icontype} style={{ fontSize: '16px' }} title={tooltip} />]
  142. },
  143. },
  144. formatter: ({ row }) => {
  145. let tooltip = i18nLocale.t('compute.text_291', [i18nLocale.t('dictionary.server')])
  146. if (row.is_gpu) {
  147. tooltip = `GPU${this.$t('dictionary.server')}`
  148. }
  149. if (row.backup_host_id) {
  150. tooltip = this.$t('compute.backup')
  151. }
  152. return tooltip
  153. },
  154. hidden: () => {
  155. return this.$isScopedPolicyMenuHidden('server_hidden_columns.is_gpu')
  156. },
  157. },
  158. getTagTableColumn({
  159. onManager: this.onManager,
  160. resource: 'server',
  161. columns: () => this.columns,
  162. tipName: this.$t('dictionary.server'),
  163. editCheck: (row) => row.hypervisor !== typeClouds.hypervisorMap.bingocloud.key,
  164. hidden: () => {
  165. return this.$isScopedPolicyMenuHidden('server_hidden_columns.metadata')
  166. },
  167. }),
  168. getIpsTableColumn({
  169. field: 'ips',
  170. title: 'IP',
  171. vm: this,
  172. sortable: true,
  173. hidden: () => {
  174. return this.$isScopedPolicyMenuHidden('server_hidden_columns.ips')
  175. },
  176. }),
  177. {
  178. field: 'macs',
  179. title: 'MAC',
  180. slots: {
  181. default: ({ row }) => {
  182. if (this.isPreLoad && !row.macs) return [<data-loading />]
  183. if (row.macs) {
  184. return row.macs.split(',').map(mac => {
  185. return <list-body-cell-wrap copy row={{ mac }} hide-field field="mac">{mac}</list-body-cell-wrap>
  186. })
  187. }
  188. return []
  189. },
  190. },
  191. hidden: () => {
  192. return this.$isScopedPolicyMenuHidden('server_hidden_columns.macs')
  193. },
  194. },
  195. getOsArch({
  196. hidden: () => {
  197. return this.$isScopedPolicyMenuHidden('server_hidden_columns.os_arch')
  198. },
  199. }),
  200. {
  201. field: 'instance_type',
  202. title: i18nLocale.t('table.title.flavor'),
  203. showOverflow: 'ellipsis',
  204. minWidth: 120,
  205. sortable: true,
  206. slots: {
  207. default: ({ row }) => {
  208. const ret = []
  209. if (row.instance_type) {
  210. ret.push(<div class='text-truncate' style={{ color: '#0A1F44' }}>{row.instance_type}</div>)
  211. }
  212. const config = row.vcpu_count + 'C' + (row.vmem_size / 1024) + 'G' + (row.disk ? sizestr(row.disk, 'M', 1024) : '')
  213. return ret.concat(<div class='text-truncate' style={{ color: '#53627C' }}>{config}</div>)
  214. },
  215. },
  216. formatter: ({ row }) => {
  217. const ret = []
  218. if (row.instance_type) {
  219. ret.push(row.instance_type)
  220. }
  221. const config = row.vcpu_count + 'C' + (row.vmem_size / 1024) + 'G' + (row.disk ? sizestr(row.disk, 'M', 1024) : '')
  222. return ret.concat(config).join(', ')
  223. },
  224. hidden: () => {
  225. return this.$isScopedPolicyMenuHidden('server_hidden_columns.instance_type')
  226. },
  227. },
  228. {
  229. field: 'vcpu_count',
  230. title: 'CPU',
  231. sortable: true,
  232. minWidth: 80,
  233. slots: {
  234. default: ({ row }) => {
  235. if (row.vcpu_count) {
  236. return [<list-body-cell-wrap row={{ row }} hide-field field="vcpu_count">{row.vcpu_count}</list-body-cell-wrap>]
  237. }
  238. return []
  239. },
  240. },
  241. hidden: () => {
  242. return this.$isScopedPolicyMenuHidden('server_hidden_columns.vcpu_count')
  243. },
  244. },
  245. {
  246. field: 'vmem_size',
  247. title: i18nLocale.t('table.title.vmem_size'),
  248. sortable: true,
  249. minWidth: 80,
  250. slots: {
  251. default: ({ row }) => {
  252. if (row.vmem_size) {
  253. const config = (row.vmem_size / 1024) + 'G'
  254. return [<list-body-cell-wrap row={{ row }} hide-field field="vmem_size">{config}</list-body-cell-wrap>]
  255. }
  256. return []
  257. },
  258. },
  259. formatter: ({ row }) => {
  260. if (row.vmem_size) {
  261. const config = (row.vmem_size / 1024) + 'G'
  262. return config
  263. }
  264. return ''
  265. },
  266. hidden: () => {
  267. return this.$isScopedPolicyMenuHidden('server_hidden_columns.vmem_size')
  268. },
  269. },
  270. {
  271. field: 'disk',
  272. title: i18nLocale.t('table.title.disk'),
  273. sortable: true,
  274. minWidth: 80,
  275. slots: {
  276. default: ({ row }) => {
  277. if (this.isPreLoad && !row.disk) return [<data-loading />]
  278. const config = row.disk ? sizestr(row.disk, 'M', 1024) : ''
  279. return [<list-body-cell-wrap row={{ row }} hide-field field="disk">{config}</list-body-cell-wrap>]
  280. },
  281. },
  282. formatter: ({ row }) => {
  283. if (!row.disk) return ''
  284. const config = row.disk ? sizestr(row.disk, 'M', 1024) : ''
  285. return config
  286. },
  287. hidden: () => {
  288. return this.$isScopedPolicyMenuHidden('server_hidden_columns.disk')
  289. },
  290. },
  291. {
  292. field: 'cpu_usage',
  293. title: i18nLocale.t('table.title.cpu_usage'),
  294. sortable: true,
  295. minWidth: 150,
  296. hidden: () => true,
  297. slots: {
  298. default: ({ row }) => {
  299. if (row.cpu_usage) {
  300. return [<a-progress percent={row.cpu_usage.toFixed(4) * 100} size="small" />]
  301. }
  302. return [<a-progress percent={0} size="small" />]
  303. },
  304. },
  305. },
  306. {
  307. field: 'mem_usage',
  308. title: i18nLocale.t('table.title.mem_usage'),
  309. sortable: true,
  310. minWidth: 150,
  311. hidden: () => true,
  312. slots: {
  313. default: ({ row }) => {
  314. if (row.mem_usage) {
  315. return [<a-progress percent={row.mem_usage.toFixed(4) * 100} size="small" />]
  316. }
  317. return [<a-progress percent={0} size="small" />]
  318. },
  319. },
  320. },
  321. {
  322. field: 'disk_usage',
  323. title: i18nLocale.t('table.title.disk_usage'),
  324. sortable: true,
  325. minWidth: 150,
  326. hidden: () => true,
  327. slots: {
  328. default: ({ row }) => {
  329. if (row.disk_usage) {
  330. return [<a-progress percent={row.disk_usage.toFixed(4) * 100} size="small" />]
  331. }
  332. return [<a-progress percent={0} size="small" />]
  333. },
  334. },
  335. },
  336. {
  337. field: 'secgroups',
  338. title: i18nLocale.t('res.secgroup'),
  339. minWidth: 80,
  340. showOverflow: 'ellipsis',
  341. slots: {
  342. default: ({ row }) => {
  343. if (this.isPreLoad && !row.secgroups) return [<data-loading />]
  344. return row.secgroups?.map(item => item.name).join(',')
  345. },
  346. },
  347. formatter: ({ row }) => {
  348. return row.secgroups?.map(item => item.name).join(',')
  349. },
  350. hidden: () => {
  351. return this.$isScopedPolicyMenuHidden('server_hidden_columns.secgroups')
  352. },
  353. },
  354. getCopyWithContentTableColumn({
  355. field: 'vpc',
  356. title: 'VPC',
  357. hideField: true,
  358. slotCallback: (row) => {
  359. if (this.isPreLoad && !row.vpc) return [<data-loading />]
  360. return row.vpc
  361. },
  362. hidden: () => {
  363. if (this.$store.getters.isProjectMode) return true
  364. return this.$isScopedPolicyMenuHidden('server_hidden_columns.vpc')
  365. },
  366. }),
  367. getBillingTableColumn({
  368. vm: this,
  369. hiddenSetBtn: () => this.$isScopedPolicyMenuHidden('vminstance_hidden_menus.server_perform_cancel_expire'),
  370. hidden: () => {
  371. return this.$isScopedPolicyMenuHidden('server_hidden_columns.billing_type')
  372. },
  373. }),
  374. getBrandTableColumn({
  375. hidden: () => {
  376. return this.$isScopedPolicyMenuHidden('server_hidden_columns.brand')
  377. },
  378. }),
  379. {
  380. field: 'host',
  381. title: i18nLocale.t('res.host'),
  382. sortable: true,
  383. showOverflow: 'ellipsis',
  384. minWidth: 100,
  385. slots: {
  386. default: ({ row }) => {
  387. if (!row.host) return [<data-loading />]
  388. if (findPlatform(row.hypervisor, 'hypervisor') === SERVER_TYPE.public || row.hypervisor === HYPERVISORS_MAP.hcso.hypervisor || row.hypervisor === HYPERVISORS_MAP.hcs.hypervisor) {
  389. return '-'
  390. }
  391. const text = row.host || '-'
  392. return [
  393. <list-body-cell-wrap copy field='host' row={row} message={text}></list-body-cell-wrap>,
  394. ]
  395. },
  396. },
  397. formatter: ({ row }) => {
  398. if (findPlatform(row.hypervisor, 'hypervisor') === SERVER_TYPE.public) {
  399. return ''
  400. }
  401. return row.host || ''
  402. },
  403. hidden: () => {
  404. if (this.$store.getters.isProjectMode) return true
  405. return this.$isScopedPolicyMenuHidden('server_hidden_columns.host')
  406. },
  407. },
  408. getProjectTableColumn({
  409. hidden: () => {
  410. return this.$isScopedPolicyMenuHidden('server_hidden_columns.tenant')
  411. },
  412. }),
  413. getRegionTableColumn({
  414. hidden: () => {
  415. return this.$isScopedPolicyMenuHidden('server_hidden_columns.region')
  416. },
  417. }),
  418. getTimeTableColumn({
  419. hidden: () => {
  420. return this.$isScopedPolicyMenuHidden('server_hidden_columns.created_at')
  421. },
  422. }),
  423. ]
  424. if (this.hideColumnFields) {
  425. this.columns = columns.filter((column) => { return !this.hideColumnFields.includes(column.field) })
  426. } else {
  427. this.columns = columns
  428. }
  429. },
  430. }