Terminal.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <template>
  2. <div>
  3. <a-form-model :model="form" layout="inline">
  4. <a-form-model-item :label="$t('compute.container', [])">
  5. <a-select style="min-width: 200px;" v-model="form.container" @change="fetchConnectUrl">
  6. <a-select-option v-for="item in containers" :value="item.id" :key="item.name">{{ item.name }}</a-select-option>
  7. </a-select>
  8. </a-form-model-item>
  9. </a-form-model>
  10. <a-skeleton v-if="form.container && !connectParams" active :paragraph="{ rows: 6 }" />
  11. <xterm :connectParams="connectParams" />
  12. </div>
  13. </template>
  14. <script>
  15. export default {
  16. name: 'ContainerTerminal',
  17. props: {
  18. data: {
  19. type: Object,
  20. required: true,
  21. },
  22. },
  23. data () {
  24. return {
  25. containers: [],
  26. form: {
  27. container: '',
  28. },
  29. connectParams: '',
  30. }
  31. },
  32. created () {
  33. this.fetchData()
  34. },
  35. methods: {
  36. async fetchData () {
  37. const manager = new this.$Manager('containers')
  38. const res = await manager.list({
  39. params: {
  40. guest_id: this.data.id,
  41. scope: this.$store.getters.scope,
  42. filter: 'status.in(\'running\')',
  43. },
  44. })
  45. this.containers = res.data.data
  46. const firstContainer = this.containers[0]?.id
  47. if (firstContainer) {
  48. this.form.container = firstContainer
  49. this.fetchConnectUrl(firstContainer)
  50. }
  51. },
  52. async fetchConnectUrl (container) {
  53. this.connectParams = ''
  54. const { data } = await new this.$Manager('webconsole', 'v1').objectRpc({
  55. methodname: 'DoContainerExec',
  56. params: {
  57. container_id: container,
  58. },
  59. })
  60. this.connectParams = data.connect_params
  61. },
  62. },
  63. }
  64. </script>