columns.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import PasswordFetcher from '@Compute/sections/PasswordFetcher'
  2. import { getRegionTableColumn, getStatusTableColumn, getEnabledTableColumn, getNameDescriptionTableColumn, getCopyWithContentTableColumn, getTagTableColumn, getPublicScopeTableColumn, getProjectDomainTableColumn, getTimeTableColumn } from '@/utils/common/tableColumn'
  3. import { sizestr } from '@/utils/utils'
  4. import i18n from '@/locales'
  5. import expectStatus from '@/constants/expectStatus'
  6. import { getMaintenanceTableColumn } from '../utils/columns'
  7. export default {
  8. created () {
  9. this.columns = [
  10. getNameDescriptionTableColumn({
  11. onManager: this.onManager,
  12. hideField: true,
  13. formRules: [
  14. { required: true, message: i18n.t('compute.text_210') },
  15. { validator: this.$validate('serverCreateName') },
  16. ],
  17. slotCallback: row => {
  18. return (
  19. <side-page-trigger name='PhysicalmachineSidePage' id={row.id} list={this.list} vm={this}>{ row.name }</side-page-trigger>
  20. )
  21. },
  22. cellWrapSlots: row => {
  23. return {
  24. append: () => {
  25. var ret = []
  26. if (row.is_import) {
  27. ret.push(<a-tooltip title={i18n.t('compute.text_846')}><icon class='ml-2' type='res-physicalmachine' style={{ color: '#1890ff' }} /></a-tooltip>)
  28. }
  29. if (row.isolated_device_count) {
  30. ret.push(<a-tooltip title={i18n.t('compute.text_113')}><icon class='ml-2' type='passthrough' /></a-tooltip>)
  31. }
  32. return ret
  33. },
  34. }
  35. },
  36. }),
  37. getStatusTableColumn({ statusModule: 'host', vm: this }),
  38. getEnabledTableColumn(),
  39. getTagTableColumn({ onManager: this.onManager, resource: 'host', columns: () => this.columns }),
  40. {
  41. field: 'custom_ip',
  42. title: 'IP',
  43. width: 200,
  44. showOverflow: 'ellipsis',
  45. slots: {
  46. default: ({ row }) => {
  47. const cellWrap = []
  48. if (row.access_ip) {
  49. cellWrap.push(
  50. <div class="d-flex">
  51. <list-body-cell-wrap row={row} field="access_ip" copy><span class="text-color-help">{ this.$t('compute.text_1319') }</span></list-body-cell-wrap>
  52. </div>,
  53. )
  54. }
  55. if (row.ipmi_ip) {
  56. cellWrap.push(
  57. <div class="d-flex">
  58. <list-body-cell-wrap row={row} field="ipmi_ip" copy><span class="text-color-help">{ this.$t('compute.text_1320') }</span></list-body-cell-wrap>
  59. </div>,
  60. )
  61. }
  62. return cellWrap
  63. },
  64. },
  65. },
  66. {
  67. field: 'ipmi',
  68. title: 'IPMI',
  69. width: 70,
  70. slots: {
  71. default: ({ row }) => {
  72. return [<PasswordFetcher serverId={ row.id } resourceType='baremetals' />]
  73. },
  74. },
  75. },
  76. {
  77. field: 'login_ssh',
  78. title: i18n.t('compute.text_566'),
  79. width: 70,
  80. slots: {
  81. default: ({ row }) => {
  82. return [<PasswordFetcher serverId={ row.server_id ? row.server_id : row.id } resourceType={row.server_id ? 'servers' : 'baremetal_ssh' } disabled={ row.is_import } promptText={row.is_import ? i18n.t('compute.text_848') : '' } />]
  83. },
  84. },
  85. },
  86. {
  87. field: 'spec',
  88. title: i18n.t('compute.text_178'),
  89. width: 120,
  90. showOverflow: 'ellipsis',
  91. slots: {
  92. default: ({ row }) => {
  93. if (this.isPreLoad && !row.spec) return [<data-loading />]
  94. if (!row.spec) return '-'
  95. const g = function (sz, prefix) {
  96. if (!prefix || prefix.length === 0) {
  97. prefix = ''
  98. }
  99. if (sz && sz > 0) {
  100. return `${prefix}${sizestr(sz, 'M', 1024)}`
  101. } else {
  102. return ''
  103. }
  104. }
  105. const spec = row.spec
  106. let cpu = ''
  107. if (spec.cpu && spec.cpu > 0) {
  108. cpu = `${spec.cpu}C`
  109. }
  110. const mem = g(spec.mem)
  111. let ssd = ''
  112. let hdd = ''
  113. if (spec.disk) {
  114. if (spec.disk.SSD) {
  115. ssd = 'SSD'
  116. for (const key in spec.disk.SSD) {
  117. ssd += `${g(spec.disk.SSD[key])}x${spec.disk.SSD[key]}`
  118. }
  119. }
  120. if (spec.disk.HDD) {
  121. hdd = 'HDD'
  122. for (const key in spec.disk.HDD) {
  123. hdd += `${g(key)}x${spec.disk.HDD[key]}`
  124. }
  125. }
  126. }
  127. let driver = ''
  128. if (spec && spec.driver && spec.driver !== 'Linux') {
  129. driver = 'RAID'
  130. }
  131. return `${cpu}${mem}${hdd}${ssd}${driver}`
  132. },
  133. },
  134. },
  135. getMaintenanceTableColumn(),
  136. {
  137. field: 'manufacture',
  138. title: i18n.t('compute.text_847'),
  139. width: 70,
  140. slots: {
  141. default: ({ row }) => {
  142. if (row.sys_info && row.sys_info.oem_name) {
  143. const icons = {
  144. dell: { height: '25px' },
  145. hp: { height: '25px' },
  146. hpe: { height: '30px' },
  147. inspur: { height: '50px' },
  148. lenovo: { height: '10px' },
  149. supermicro: { height: '30px' },
  150. huawei: { height: '30px' },
  151. }
  152. const arr = Object.keys(icons)
  153. if (!arr.includes(row.sys_info.oem_name)) {
  154. return row.sys_info.oem_name
  155. }
  156. const imgSrc = require(`../assets/${row.sys_info.oem_name}.svg`)
  157. return [
  158. <a-tooltip title={ row.sys_info.oem_name }>
  159. <img src={ imgSrc } style={ icons[row.sys_info.oem_name] } />
  160. </a-tooltip>,
  161. ]
  162. }
  163. },
  164. },
  165. },
  166. {
  167. field: 'model',
  168. title: this.$t('compute.text_580'),
  169. formatter: ({ cellValue, row }) => {
  170. return ((row.sys_info || {}).model) || '-'
  171. },
  172. },
  173. getCopyWithContentTableColumn({
  174. field: 'server',
  175. title: i18n.t('compute.text_602'),
  176. hideField: true,
  177. slotCallback: row => {
  178. if (!row.server) return '-'
  179. return <side-page-trigger permission="server_get" onTrigger={() => this.handleOpenBaremetalDetail(row.server_id)}>
  180. {row.server}
  181. </side-page-trigger>
  182. },
  183. }),
  184. {
  185. field: 'access_mac',
  186. title: 'MAC',
  187. width: 130,
  188. },
  189. getCopyWithContentTableColumn({ field: 'sn', title: 'SN' }),
  190. getPublicScopeTableColumn({ vm: this, resource: 'hosts' }),
  191. getProjectDomainTableColumn({ vm: this }),
  192. getRegionTableColumn({ vm: this }),
  193. getTimeTableColumn(),
  194. ]
  195. },
  196. methods: {
  197. handleOpenBaremetalDetail (id) {
  198. this.sidePageTriggerHandle(this, 'BaremetalSidePage', {
  199. id,
  200. resource: 'servers',
  201. steadyStatus: Object.values(expectStatus.server).flat(),
  202. }, {
  203. list: this.list,
  204. tab: 'baremetal-detail',
  205. })
  206. },
  207. },
  208. }