| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538 |
- import { mapGetters } from 'vuex'
- // import { Base64 } from 'js-base64'
- import qs from 'qs'
- import { disableDeleteAction } from '@/utils/common/tableActions'
- import expectStatus from '@/constants/expectStatus'
- import i18n from '@/locales'
- import { SMART_SSH_FORM_DECORATORS } from '@Compute/constants'
- import { commonUnabled, cloudEnabled, cloudUnabledTip } from '../../vminstance/utils'
- import { solWebConsole, jnlpConsole } from '../../../utils/webconsole'
- import { hostServerActions } from '../../../utils/hostActions'
- export default {
- computed: {
- ...mapGetters(['isAdminMode', 'isDomainMode', 'userInfo', 'auth', 'common']),
- enableMFA () {
- return this.userInfo.enable_mfa && this.auth.auth.system_totp_on
- },
- enableWaterMark () {
- const { globalConfig = {} } = this.common
- const { enable_watermark = true } = globalConfig
- return enable_watermark
- },
- },
- destroyed () {
- this.webconsoleManager = null
- },
- created () {
- this.webconsoleManager = new this.$Manager('webconsole', 'v1')
- this.singleActions = [
- {
- label: i18n.t('compute.text_341'),
- permission: 'server_get_vnc',
- actions: obj => {
- let ret = []
- ret.push(solWebConsole(this.webconsoleManager, obj, this.openWebConsole, this.createDialog))
- const openWebConsole = (params) => {
- this.webconsoleManager.performAction(params).then(({ data }) => {
- const connectParams = qs.parse(data.connect_params)
- // 验证账号密码
- if (connectParams.is_need_login === 'true') {
- this.createDialog('SshAuthDialog', {
- manager: this.webconsoleManager,
- params,
- errorMsg: connectParams.login_error_message,
- data: { name: obj.name, ip: params.action, id: obj.id, resource: 'servers' },
- success: (data) => {
- this.openWebConsole(obj, data, 'ws')
- },
- })
- return
- }
- // 无需验证账号密码
- this.openWebConsole(obj, data, 'ws')
- })
- }
- const mapIpActions = (ipArr, type) => {
- if (!['IP SSH', 'EIP SSH'].includes(type)) throw Error(i18n.t('compute.text_343'))
- const options = []
- ipArr.forEach(v => {
- const meta = () => {
- const ret = {
- validate: true,
- tooltip: null,
- }
- if (obj.os_type === 'Windows') {
- ret.tooltip = i18n.t('compute.text_344')
- ret.validate = false
- return ret
- }
- if (obj.provider === 'OneCloud') {
- ret.validate = obj.power_states === 'on'
- ret.tooltip = obj.power_states === 'on' ? '' : i18n.t('compute.power_states_check_tip', [i18n.t('compute.text_92'), `【${i18n.t('compute.text_574')}】`])
- } else {
- ret.validate = obj.power_states === 'unknown' ? cloudEnabled(type, obj) : obj.power_states === 'on'
- ret.tooltip = obj.power_states === 'unknown' ? cloudUnabledTip(type, obj) : (obj.power_states === 'on' ? '' : i18n.t('compute.power_states_check_tip', [i18n.t('compute.text_92'), `【${i18n.t('compute.text_574')}】`]))
- if (cloudEnabled(type, obj) === false) {
- ret.validate = false
- ret.tooltip = cloudUnabledTip(type, obj)
- }
- }
- return ret
- }
- options.push({
- label: `SSH ${v}`,
- action: () => {
- const success = () => {
- const params = {
- id: 'ssh',
- action: v,
- data: {},
- }
- openWebConsole(params)
- }
- if (this.enableMFA) {
- this.createDialog('SecretVertifyDialog', {
- success,
- })
- } else {
- success()
- }
- },
- meta,
- render: (obj, params, h) => {
- let styleObj = {
- padding: '0 10px',
- fontSize: '12px',
- }
- const isRunning = obj.power_states === 'on'
- if (!isRunning) {
- styleObj = {
- ...styleObj,
- cursor: 'not-allowed',
- color: 'rgba(0, 0, 0, 0.25)',
- }
- }
- const sshConnectHandle = () => {
- const success = () => {
- openWebConsole({
- action: v,
- data: { },
- id: 'ssh',
- })
- }
- if (this.enableMFA) {
- this.createDialog('SecretVertifyDialog', {
- success,
- })
- } else {
- success()
- }
- }
- const sshSettingInfoHandle = () => {
- this.createDialog('SmartFormDialog', {
- title: i18n.t('compute.custom_ssh_connect', ['SSH']),
- data: [obj],
- callback: async (data) => {
- const pms = {
- action: v,
- data: { port: data.port, username: data.username, password: data.password },
- id: 'ssh',
- }
- openWebConsole(pms)
- },
- decorators: SMART_SSH_FORM_DECORATORS,
- })
- }
- return <a-tooltip placement="left" title={!isRunning ? meta().tooltip : ''}>
- <span style={styleObj} class='d-flex justify-content-between align-items-center'>
- <span onClick={isRunning ? sshConnectHandle : () => { }}>{`SSH ${v}`}</span>
- {
- isRunning ? <span>
- <a-tooltip title={i18n.t('compute.custom_ssh_connect', ['SSH'])}>
- <a-icon class="ml-2" type="edit" onClick={isRunning ? sshSettingInfoHandle : () => { }} />
- </a-tooltip>
- </span> : null
- }
- </span>
- </a-tooltip>
- },
- })
- // options.push({
- // label: i18n.t('compute.text_345', [v]),
- // action: () => {
- // this.createDialog('SmartFormDialog', {
- // title: i18n.t('compute.text_346'),
- // data: [obj],
- // callback: async (data) => {
- // const success = () => {
- // const params = {
- // action: v,
- // data,
- // id: 'ssh',
- // }
- // openWebConsole(params)
- // }
- // if (this.enableMFA) {
- // this.createDialog('SecretVertifyDialog', {
- // success,
- // })
- // } else {
- // success()
- // }
- // },
- // decorators: {
- // port: [
- // 'port',
- // {
- // validateFirst: true,
- // rules: [
- // { required: true, message: i18n.t('compute.text_347') },
- // {
- // validator: (rule, value, _callback) => {
- // const num = parseFloat(value)
- // if (!/^\d+$/.test(value) || !num || num > 65535) {
- // _callback(i18n.t('compute.text_348'))
- // }
- // _callback()
- // },
- // },
- // ],
- // },
- // {
- // label: i18n.t('compute.text_349'),
- // placeholder: i18n.t('compute.text_350'),
- // },
- // ],
- // },
- // })
- // },
- // meta,
- // })
- })
- return options
- }
- let eips = (obj.eip || '').split(',').filter(item => !!item)
- let ips = (obj.ips || '').split(',').filter(item => !!item)
- eips = eips.length ? mapIpActions(eips, 'EIP SSH') : []
- ips = ips.length ? mapIpActions(ips, 'IP SSH') : []
- ret = ret.concat(eips).concat(ips)
- ret.push({ ...jnlpConsole(new this.$Manager('servers', 'v2'), obj, this.createDialog), permission: 'server_get_jnlp' })
- return ret
- },
- meta: (obj) => {
- let ret = {
- validate: true,
- tooltip: null,
- }
- ret = this.$isValidateResourceLock(obj)
- return ret
- },
- },
- {
- label: i18n.t('compute.text_352'),
- actions: (obj) => {
- return [
- {
- label: i18n.t('compute.text_353'),
- submenus: hostServerActions(this.onManager, obj, this, false),
- },
- {
- label: i18n.t('compute.text_356'),
- submenus: [
- {
- label: i18n.t('compute.text_357'),
- permission: 'server_perform_rebuild_root',
- action: () => {
- this.createDialog('VmRebuildRootDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- })
- },
- meta: () => {
- const ret = {
- validate: true,
- tooltip: null,
- }
- if (obj.metadata.is_fake_baremetal_server === 'true') {
- ret.tooltip = i18n.t('compute.tooltip.check_fake_baremetal_server')
- ret.validate = false
- return ret
- }
- if (obj.status !== 'ready' && obj.status !== 'admin') {
- ret.tooltip = i18n.t('compute.text_358')
- ret.validate = false
- return ret
- }
- if (commonUnabled(obj)) return ret
- ret.validate = cloudEnabled('rebuildRoot', { ...obj, brand: 'baremetal' })
- ret.tooltip = cloudUnabledTip('rebuildRoot', { ...obj, brand: 'baremetal' })
- return ret
- },
- },
- {
- label: i18n.t('compute.perform_sync_status'),
- permission: 'server_perform_syncstatus',
- action: () => {
- this.onManager('performAction', {
- steadyStatus: Object.values(expectStatus.server).flat(),
- id: obj.id,
- managerArgs: {
- action: 'syncstatus',
- },
- })
- },
- },
- {
- label: this.$t('compute.perform_change_owner', [this.$t('dictionary.project')]),
- permission: 'server_perform_change_owner',
- action: () => {
- this.createDialog('ChangeOwenrDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- resource: 'servers',
- })
- },
- meta: () => {
- const ret = {
- validate: false,
- tooltip: null,
- }
- if (commonUnabled(obj)) return ret
- ret.validate = true
- return ret
- },
- },
- {
- label: i18n.t('compute.text_359'),
- permission: 'server_create',
- action: () => {
- this.createDialog('VmCloneDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- type: 'baremetal',
- })
- },
- meta: () => {
- const ret = {
- validate: true,
- tooltip: null,
- }
- if (obj.metadata.is_fake_baremetal_server === 'true') {
- ret.tooltip = i18n.t('compute.tooltip.check_fake_baremetal_server')
- ret.validate = false
- return ret
- }
- return ret
- },
- },
- ],
- },
- {
- label: i18n.t('compute.text_360'),
- submenus: [
- {
- label: i18n.t('compute.text_276'),
- permission: 'server_perform_deploy',
- action: () => {
- this.createDialog('VmResetPasswordDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- })
- },
- meta: () => {
- const ret = {
- validate: true,
- tooltip: null,
- }
- if (obj.metadata.is_fake_baremetal_server === 'true') {
- ret.tooltip = i18n.t('compute.tooltip.check_fake_baremetal_server')
- ret.validate = false
- return ret
- }
- if (obj.keypair_id && obj.keypair_id.toLowerCase() !== 'none') {
- ret.tooltip = i18n.t('compute.text_277')
- ret.validate = false
- return ret
- }
- if (commonUnabled(obj)) return ret
- ret.validate = cloudEnabled('resetPassword', { ...obj, brand: 'baremetal' })
- ret.tooltip = cloudUnabledTip('resetPassword', { ...obj, brand: 'baremetal' })
- return ret
- },
- },
- {
- label: i18n.t('compute.text_361'),
- permission: 'server_perform_deploy',
- action: () => {
- this.createDialog('VmBindKeypairDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- })
- },
- meta: () => {
- const ret = {
- validate: true,
- tooltip: null,
- }
- if (obj.metadata.is_fake_baremetal_server === 'true') {
- ret.tooltip = i18n.t('compute.tooltip.check_fake_baremetal_server')
- ret.validate = false
- return ret
- }
- if (obj.os_type === 'Windows') {
- ret.tooltip = i18n.t('compute.text_362')
- ret.validate = false
- return ret
- }
- if (obj.keypair) {
- ret.tooltip = i18n.t('compute.text_363')
- ret.validate = false
- return ret
- }
- if (commonUnabled(obj)) return ret
- ret.validate = cloudEnabled('bindKeyPair', obj)
- ret.tooltip = cloudUnabledTip('bindKeyPair', obj)
- return ret
- },
- },
- {
- label: i18n.t('compute.text_364'),
- permission: 'server_perform_deploy',
- action: () => {
- this.createDialog('VmUnbindKeypairDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- })
- },
- meta: () => {
- const ret = {
- validate: true,
- tooltip: null,
- }
- if (obj.metadata.is_fake_baremetal_server === 'true') {
- ret.tooltip = i18n.t('compute.tooltip.check_fake_baremetal_server')
- ret.validate = false
- return ret
- }
- if (obj.os_type === 'Windows') {
- ret.tooltip = i18n.t('compute.text_362')
- ret.validate = false
- return ret
- }
- if (!obj.keypair) {
- ret.tooltip = i18n.t('compute.text_365')
- ret.validate = false
- return ret
- }
- if (commonUnabled(obj)) return ret
- ret.validate = cloudEnabled('unBindKeyPair', obj)
- ret.tooltip = cloudUnabledTip('unBindKeyPair', obj)
- return ret
- },
- },
- ],
- },
- {
- label: i18n.t('compute.text_96'),
- submenus: [
- {
- label: i18n.t('compute.text_366'),
- permission: 'server_perform_insertiso',
- action: () => {
- this.createDialog('VmMountIsoDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- refresh: this.refresh,
- })
- },
- meta: () => {
- return {
- validate: obj.cdrom_support && !obj.cdrom,
- }
- },
- },
- {
- label: i18n.t('compute.text_367'),
- permission: 'server_perform_ejectiso',
- action: () => {
- this.createDialog('VmUnmountIsoDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- refresh: this.refresh,
- })
- },
- meta: () => {
- return {
- validate: obj.cdrom_support && obj.cdrom,
- }
- },
- },
- ],
- },
- {
- label: i18n.t('compute.perform_delete'),
- submenus: [
- disableDeleteAction(this),
- {
- label: i18n.t('compute.perform_delete'),
- permission: 'server_delete',
- action: () => {
- this.createDialog('DeleteResDialog', {
- vm: this,
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- title: i18n.t('compute.perform_delete'),
- success: () => {
- this.destroySidePages()
- },
- })
- },
- meta: () => {
- const ret = {
- validate: false,
- tooltip: null,
- }
- if (this.isAdminMode && obj.billing_type === 'prepaid') {
- ret.tooltip = i18n.t('compute.text_285')
- return ret
- }
- if (!obj.can_delete) {
- ret.tooltip = i18n.t('compute.text_284')
- return ret
- }
- ret.validate = true
- return ret
- },
- },
- ],
- },
- ]
- },
- meta: (obj) => {
- let ret = {
- validate: true,
- tooltip: null,
- }
- ret = this.$isValidateResourceLock(obj)
- return ret
- },
- },
- ]
- },
- methods: {
- openWebConsole (obj, data, protocol) {
- this.$openWebConsole(data)
- },
- },
- }
|