Asbook.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <template>
  2. <div class="ansible-playbook">
  3. <refresh-button class="flex-shrink-0" :loading="isRunning" @refresh="refresh" />
  4. <a-button class="flex-shrink-0 ml-2" @click="handleRun" :disabled="this.isRunning">{{$t('network.text_28')}}</a-button>
  5. <a-button class="flex-shrink-0 ml-2" @click="handleStop" :disabled="!this.isRunning">{{$t('network.text_32')}}</a-button>
  6. <detail
  7. :data="resourceData"
  8. :base-info="baseInfo"
  9. :extra-info="extraInfo"
  10. :onManager="()=> {}"
  11. status-module="ansiblePlaybook" />
  12. </div>
  13. </template>
  14. <script>
  15. import Ansible from '../controls/ansible'
  16. import RefreshButton from '@/components/PageList/RefreshButton'
  17. import WindowsMixin from '@/mixins/windows'
  18. export default {
  19. name: 'Ansibleplaybook',
  20. components: {
  21. RefreshButton,
  22. },
  23. mixins: [WindowsMixin],
  24. props: {
  25. data: {
  26. type: Object,
  27. required: true,
  28. },
  29. },
  30. data () {
  31. return {
  32. T: null,
  33. isRunning: false,
  34. resourceData: {},
  35. columns: [
  36. {
  37. field: 'name',
  38. title: this.$t('network.text_34'),
  39. },
  40. ],
  41. cmOptions: {
  42. tabSize: 2,
  43. styleActiveLine: true,
  44. lineNumbers: true,
  45. line: true,
  46. name: 'javascript',
  47. json: true,
  48. theme: 'material',
  49. },
  50. baseInfo: [
  51. {
  52. field: 'start_time',
  53. title: this.$t('network.text_35'),
  54. formatter: ({ cellValue }) => {
  55. return this.$moment(cellValue).format(this.$t('network.text_36'))
  56. },
  57. },
  58. {
  59. field: 'end_time',
  60. title: this.$t('network.text_37'),
  61. formatter: ({ cellValue }) => {
  62. return this.$moment(cellValue).format(this.$t('network.text_36'))
  63. },
  64. },
  65. ],
  66. extraInfo: [
  67. {
  68. title: this.$t('network.text_133'),
  69. items: [
  70. {
  71. field: 'output',
  72. slots: {
  73. default: ({ row }, h) => {
  74. return [
  75. <code-mirror value={ row.output } options={ this.cmOptions } />,
  76. ]
  77. },
  78. },
  79. },
  80. ],
  81. },
  82. ],
  83. }
  84. },
  85. watch: {
  86. isRunning (nextVal) {
  87. clearInterval(this.T)
  88. if (nextVal) {
  89. this.T = setInterval(() => {
  90. this.refresh()
  91. }, 10000)
  92. }
  93. },
  94. },
  95. created () {
  96. const { ansible_playbook } = this.data.deployment
  97. this.ansibleEvents = new Ansible(ansible_playbook)
  98. this.refresh()
  99. },
  100. methods: {
  101. refresh () {
  102. return this.ansibleEvents
  103. .get()
  104. .then(({ data }) => {
  105. this.resourceData = data
  106. this.isRunning = data.status === 'running'
  107. if (!this.isRunning) {
  108. clearInterval(this.T)
  109. }
  110. this.ansibleplaybookData = data
  111. this.$nextTick(() => {
  112. document.getElementsByClassName('CodeMirror-scroll')[0].scrollTop = 999999
  113. })
  114. })
  115. },
  116. handleStop () {
  117. this.createDialog('DisableDialog', {
  118. title: this.$t('network.text_134'),
  119. name: this.$t('network.text_20'),
  120. columns: this.columns,
  121. data: [this.ansibleplaybookData],
  122. alert: this.$t('network.text_29'),
  123. ok: async () => {
  124. try {
  125. await this.ansibleEvents.stop()
  126. this.$message.success(this.$t('network.text_40'))
  127. this.refresh()
  128. } catch (error) {
  129. throw error
  130. }
  131. },
  132. })
  133. },
  134. async handleRun () {
  135. try {
  136. this.ansibleplaybookData.output = ' '
  137. await this.ansibleEvents.run()
  138. this.refresh()
  139. } catch (err) {
  140. throw err
  141. }
  142. },
  143. handleCancel () {
  144. this.$router.push('/lbagent')
  145. },
  146. },
  147. }
  148. </script>
  149. <style lang="less" scoped>
  150. .ansible-playbook {
  151. ::v-deep {
  152. .CodeMirror {
  153. height: 700px !important;
  154. }
  155. }
  156. }
  157. </style>