index.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <template>
  2. <base-side-page
  3. @cancel="cancelSidePage"
  4. :title="$t('compute.text_92')"
  5. icon="res-baremetal"
  6. :res-name="detailData.name"
  7. :current-tab="params.windowData.currentTab"
  8. :tabs="detailTabs"
  9. :loaded="loaded"
  10. @tab-change="handleTabChange">
  11. <template v-slot:actions>
  12. <actions :options="singleActions" :row="detailData" button-type="link" button-size="small" />
  13. </template>
  14. <component
  15. :is="params.windowData.currentTab"
  16. :data="componentData"
  17. :id="listId"
  18. :res-id="data.id"
  19. :getParams="getParams"
  20. :on-manager="onManager"
  21. :columns="columns"
  22. :isPageDestroyed="isPageDestroyed"
  23. taskResource="compute-tasks"
  24. @side-page-trigger-handle="sidePageTriggerHandle"
  25. @init-side-page-tab="initSidePageTab"
  26. @refresh="refresh"
  27. @single-refresh="singleRefresh"
  28. @tab-change="handleTabChange" />
  29. </base-side-page>
  30. </template>
  31. <script>
  32. import SidePageMixin from '@/mixins/sidePage'
  33. import WindowsMixin from '@/mixins/windows'
  34. import Actions from '@/components/PageList/Actions'
  35. import SingleActionsMixin from '../mixins/singleActions'
  36. import ColumnsMixin from '../mixins/columns'
  37. import BaremetalDetail from './Detail'
  38. import NetworkListForBaremetalSidepage from './Network'
  39. import DiskListForBaremetalSidepage from './Disk'
  40. import BaremetalMonitorSidepage from './Monitor'
  41. // import BaremetalAlertSidepage from './Alert'
  42. export default {
  43. name: 'BaremetalSidePage',
  44. components: {
  45. Actions,
  46. BaremetalDetail,
  47. NetworkListForBaremetalSidepage,
  48. DiskListForBaremetalSidepage,
  49. // BaremetalAlertSidepage,
  50. BaremetalMonitorSidepage,
  51. },
  52. mixins: [SidePageMixin, WindowsMixin, ColumnsMixin, SingleActionsMixin],
  53. data () {
  54. return {
  55. detailTabs: [
  56. { label: this.$t('compute.text_238'), key: 'baremetal-detail' },
  57. { label: this.$t('compute.text_104'), key: 'network-list-for-baremetal-sidepage' },
  58. { label: this.$t('compute.text_376'), key: 'disk-list-for-baremetal-sidepage' },
  59. { label: this.$t('compute.text_608'), key: 'baremetal-monitor-sidepage' },
  60. { label: this.$t('table.title.task'), key: 'task-drawer' },
  61. // { label: '报警', key: 'baremetal-alert-sidepage' },
  62. { label: this.$t('compute.text_240'), key: 'event-drawer' },
  63. ],
  64. agent_status: '',
  65. agent_fail_reason: '',
  66. agent_fail_code: '',
  67. isPageDestroyed: false,
  68. }
  69. },
  70. computed: {
  71. getParams () {
  72. if (this.params.windowData.currentTab === 'network-list-for-baremetal-sidepage') {
  73. return {
  74. details: true,
  75. with_meta: true,
  76. }
  77. }
  78. if (this.params.windowData.currentTab === 'disk-list-for-baremetal-sidepage') {
  79. return {
  80. details: true,
  81. with_meta: true,
  82. }
  83. }
  84. return null
  85. },
  86. listId () {
  87. switch (this.params.windowData.currentTab) {
  88. case 'event-drawer':
  89. return 'EventListForBaremetalSidepage'
  90. default:
  91. return ''
  92. }
  93. },
  94. componentData () {
  95. return Object.assign({}, this.detailData, { agent_status: this.agent_status, agent_fail_reason: this.agent_fail_reason, agent_fail_code: this.agent_fail_code })
  96. },
  97. },
  98. created () {
  99. this.$bus.$on('agentStatusQuery', (val) => {
  100. if (this.agent_status === 'failed') {
  101. this.agent_status = 'applying'
  102. }
  103. this.handleInstallTask({
  104. script_apply_id: val,
  105. })
  106. })
  107. },
  108. beforeDestroy () {
  109. this.isPageDestroyed = true
  110. },
  111. methods: {
  112. async fetchDataCallback () {
  113. try {
  114. if (!this.data.data) return
  115. const { data: { data = [] } } = await new this.$Manager('scriptapplyrecords').list({ params: { server_id: this.data.data.id, details: false, limit: 1 } })
  116. if (data[0]) {
  117. this.agent_status = data[0].status
  118. if (data[0].status === 'applying') {
  119. this.handleInstallTask({
  120. server_id: this.componentData.id,
  121. details: false,
  122. limit: 1,
  123. })
  124. } else if (data[0].status === 'failed') {
  125. this.agent_fail_reason = data[0].reason
  126. this.agent_fail_code = data[0].fail_code || ''
  127. }
  128. }
  129. } catch (e) {}
  130. },
  131. async handleInstallTask (params) {
  132. try {
  133. let maxTry = 60
  134. while (maxTry > 0) {
  135. if (this.isPageDestroyed) {
  136. break
  137. }
  138. const { data: { data = [] } } = await new this.$Manager('scriptapplyrecords').list({ params })
  139. if (data[0]) {
  140. if (data[0].status === 'succeed' || data[0].status === 'failed') {
  141. this.agent_status = data[0].status
  142. this.agent_fail_reason = data[0].reason
  143. this.agent_fail_code = data[0].fail_code || ''
  144. break
  145. }
  146. }
  147. maxTry -= 1
  148. await new Promise(resolve => setTimeout(resolve, 6000))
  149. }
  150. } catch (e) {}
  151. },
  152. },
  153. }
  154. </script>