| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518 |
- import { disableDeleteAction } from '@/utils/common/tableActions'
- import i18n from '@/locales'
- import { BRAND_MAP, PROVIDER_MAP } from '@/constants'
- import { typeClouds } from '@/utils/common/hypervisor'
- import { hasSetupKey } from '@/utils/auth'
- import { validateRescueMode, cloudEnabled, cloudUnabledTip, commonUnabled } from '../utils'
- // import { POLICY_RES_NAME_KEY_MAP } from '@/constants/policy'
- const getSingleActions = function () {
- return [
- // 终端
- {
- label: i18n.t('compute.repo.terminal'),
- actions: (obj) => {
- const containers = obj.containers || []
- return containers.map(item => {
- return {
- label: item.name,
- action: async () => {
- const connectRes = await this.fetchConnectUrl(item.id)
- this.openWebConsole(connectRes)
- },
- }
- })
- },
- meta: (obj) => {
- const ret = { validate: true }
- if (!obj.containers?.length) {
- ret.validate = false
- return ret
- }
- if (obj.status !== 'running' && obj.status !== 'probing') {
- ret.tooltip = this.$t('compute.repo.helper.terminal', [this.$t('compute.vminstance-container')])
- ret.validate = false
- }
- return ret
- },
- },
- {
- label: i18n.t('compute.text_352'),
- actions: (obj) => {
- return [
- {
- label: i18n.t('compute.text_353'),
- submenus: [
- // 同步状态
- {
- label: i18n.t('compute.perform_sync_status'),
- permission: 'server_perform_syncstatus',
- action: () => {
- this.onManager('performAction', {
- steadyStatus: ['running', 'ready'],
- id: obj.id,
- managerArgs: {
- action: 'syncstatus',
- },
- })
- },
- hidden: () => this.$isScopedPolicyMenuHidden('vminstance_hidden_menus.server_perform_syncstatus'),
- },
- // 开机
- {
- label: i18n.t('compute.text_272'),
- action: () => {
- this.onManager('performAction', {
- steadyStatus: 'running',
- id: obj.id,
- managerArgs: {
- action: 'start',
- },
- })
- },
- meta: () => {
- return {
- validate: obj.status === 'ready',
- }
- },
- },
- // 关机
- {
- label: i18n.t('compute.text_273'),
- action: () => {
- this.createDialog('VmShutDownDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- name: i18n.t('compute.vminstance-container'),
- })
- },
- meta: () => {
- return {
- validate: obj.status === 'running',
- }
- },
- },
- // 重启
- {
- label: i18n.t('compute.text_274'),
- action: () => {
- this.createDialog('VmContainerRestartDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- })
- },
- meta: () => {
- return {
- validate: obj.status === 'running',
- }
- },
- },
- // 重置
- {
- label: i18n.t('compute.text_354'),
- permission: 'server_perform_reset',
- action: () => {
- this.createDialog('VmContainerResetDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- })
- },
- meta: () => {
- const provider = obj.provider
- const ret = {
- validate: false,
- tooltip: null,
- }
- if (obj.brand !== BRAND_MAP.OneCloud.key) {
- ret.tooltip = i18n.t('compute.text_473', [PROVIDER_MAP[provider].label])
- return ret
- }
- return {
- validate: obj.status === 'running' || obj.status === 'stop_fail',
- }
- },
- },
- // 推送配置
- {
- label: i18n.t('compute.sync_config'),
- permission: 'server_perform_sync_config',
- action: () => {
- this.createDialog('VmSyncConfigDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- })
- },
- meta: () => {
- const ret = {
- validate: false,
- tooltip: null,
- }
- if (obj.status !== 'running' && obj.status !== 'ready') {
- ret.validate = false
- ret.tooltip = i18n.t('compute.text_1126')
- return ret
- }
- ret.validate = true
- return ret
- },
- hidden: () => this.$isScopedPolicyMenuHidden('vminstance_hidden_menus.server_perform_sync_config'),
- },
- ],
- },
- {
- label: i18n.t('compute.text_356'),
- submenus: [
- // 创建相同配置
- {
- label: i18n.t('compute.text_359'),
- permission: 'server_create',
- action: () => {
- this.$openNewWindowForMenuHook('vminstance_configured_callback_address.create_same_configuration_callback_address', () => {
- this.createDialog('VmContainerCloneDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- })
- })
- },
- meta: () => {
- const ret = {
- validate: false,
- tooltip: null,
- }
- const rescueModeValid = validateRescueMode(obj)
- if (!rescueModeValid.validate) return rescueModeValid
- if (obj.is_prepaid_recycle) {
- ret.tooltip = i18n.t('compute.text_285')
- return ret
- }
- if (obj.brand !== BRAND_MAP.OneCloud.key) {
- ret.tooltip = i18n.t('compute.text_473', [typeClouds.hypervisorMap[obj.hypervisor]?.label || ''])
- return ret
- }
- ret.validate = true
- return ret
- },
- },
- // 更改项目
- {
- label: this.$t('compute.perform_change_owner', [this.$t('dictionary.project')]),
- action: (obj) => {
- this.createDialog('ChangeOwenrDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- refresh: this.refresh,
- resource: 'servers',
- })
- },
- },
- // 到期释放
- {
- label: i18n.t('compute.text_1132'),
- action: () => {
- this.createDialog('SetDurationDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- name: i18n.t('compute.vminstance-container'),
- alert: i18n.t('compute.repo.helper.set_duration.alert'),
- refresh: this.refresh,
- })
- },
- meta: () => {
- const ret = { validate: true }
- if (obj.billing_type === 'prepaid') {
- ret.validate = false
- ret.tooltip = i18n.t('compute.text_285')
- return ret
- }
- return ret
- },
- },
- // 加入反亲和组
- {
- label: i18n.t('compute.text_1181', [i18n.t('dictionary.instancegroup')]),
- permission: 'server_perform_bind_groups,server_perform_unbind_groups',
- action: () => {
- this.createDialog('VmContainerBindInstanceGroupDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- refresh: this.refresh,
- name: i18n.t('dictionary.server_container'),
- })
- },
- meta: () => {
- const provider = obj.provider
- const ret = {
- validate: false,
- tooltip: null,
- }
- const rescueModeValid = validateRescueMode(obj)
- if (!rescueModeValid.validate) return rescueModeValid
- if (obj.brand !== BRAND_MAP.OneCloud.key) {
- ret.tooltip = i18n.t('compute.text_473', [PROVIDER_MAP[provider].label])
- return ret
- }
- if (!['running', 'ready'].includes(obj.status)) {
- ret.tooltip = i18n.t('compute.text_1126')
- return ret
- }
- if (obj.backup_host_id) {
- ret.tooltip = i18n.t('compute.text_1283')
- return ret
- }
- ret.validate = true
- return ret
- },
- },
- ],
- },
- {
- label: i18n.t('compute.group_action.update_config'),
- submenus: [
- // 调整配置
- {
- label: i18n.t('compute.text_1100'),
- action: (obj) => {
- this.$router.push({
- name: 'VMContainerInstanceAdjustConfig',
- query: {
- id: obj.id,
- },
- })
- },
- meta: (obj) => {
- const ret = {
- validate: true,
- tooltip: null,
- }
- if (obj.status !== 'ready') {
- ret.tooltip = this.$t('compute.repo.helper.change_config')
- ret.validate = false
- }
- return ret
- },
- },
- // 设置GPU卡
- {
- label: i18n.t('compute.text_1112'),
- permission: 'server_perform_set_isolated_device,attach-isolated-device,server_perform_detach_isolated_device',
- action: () => {
- this.createDialog('VmContainerAttachGpuDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- })
- },
- // meta: () => {
- // const provider = obj.provider
- // const ret = {
- // validate: false,
- // tooltip: null,
- // }
- // const rescueModeValid = validateRescueMode(obj)
- // if (!rescueModeValid.validate) return rescueModeValid
- // if (!this.isAdminMode && !this.isDomainMode) {
- // ret.tooltip = i18n.t('compute.text_1279', [i18n.t('dictionary.domain')])
- // return ret
- // }
- // if (obj.brand !== BRAND_MAP.OneCloud.key) {
- // ret.tooltip = i18n.t('compute.text_473', [PROVIDER_MAP[provider].label])
- // return ret
- // }
- // ret.validate = cloudEnabled('acttachGpu', obj)
- // ret.tooltip = cloudUnabledTip('acttachGpu', obj)
- // return ret
- // },
- },
- ],
- },
- {
- label: i18n.t('compute.text_1290'),
- submenus: [
- // 关联安全组
- {
- label: i18n.t('compute.text_1116'),
- permissionLabels: [i18n.t('compute.text_1116'), i18n.t('compute.revoke_secgroup'), i18n.t('compute.set_secgroup')],
- permission: 'server_perform_add_secgroup,server_perform_revoke_secgroup,server_perform_set_secgroup',
- action: () => {
- this.createDialog('VmSetSecgroupDialog', {
- vm: this,
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- refresh: this.refresh,
- })
- },
- meta: () => {
- const rescueModeValid = validateRescueMode(obj)
- if (!rescueModeValid.validate) return rescueModeValid
- const ret = {
- validate: cloudEnabled('assignSecgroup', obj),
- tooltip: cloudUnabledTip('assignSecgroup', obj),
- }
- return ret
- },
- },
- // 设置源/目标检查
- {
- label: i18n.t('compute.text_1124'),
- permission: 'server_perform_modify_src_check',
- action: () => {
- this.createDialog('VmContainerSourceTargetCheckDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- refresh: this.refresh,
- })
- },
- meta: () => {
- const provider = obj.provider
- const ret = { validate: true, tooltip: null }
- const rescueModeValid = validateRescueMode(obj)
- if (!rescueModeValid.validate) return rescueModeValid
- if (obj.brand !== BRAND_MAP.OneCloud.key) {
- ret.validate = false
- ret.tooltip = i18n.t('compute.text_473', [PROVIDER_MAP[provider].label])
- return ret
- }
- if (!['running', 'ready'].includes(obj.status)) {
- ret.validate = false
- ret.tooltip = i18n.t('compute.text_1126')
- return ret
- }
- return ret
- },
- },
- // 绑定eip
- {
- label: i18n.t('compute.text_1179'),
- permission: 'server_perform_create_eip',
- action: () => {
- this.createDialog('VmBindEipDialog', {
- data: [obj],
- columns: this.columns,
- refresh: this.refresh,
- onManager: this.onManager,
- })
- },
- meta: () => {
- const ret = {
- validate: false,
- tooltip: null,
- }
- const rescueModeValid = validateRescueMode(obj)
- if (!rescueModeValid.validate) return rescueModeValid
- if (commonUnabled(obj)) return ret
- if (obj.eip_mode === 'public_ip' && obj.hypervisor !== 'aws') {
- ret.tooltip = i18n.t('compute.public_ip_tooltip')
- return ret
- }
- if (obj.eip_mode !== 'public_ip' && obj.eip) {
- ret.tooltip = i18n.t('compute.text_1291')
- return ret
- }
- if (obj.brand === 'OneCloud' && obj.vpc_id === 'default') {
- ret.tooltip = i18n.t('compute.text_1292')
- return ret
- }
- if (obj.vpc_external_access_mode === 'none') {
- ret.tooltip = i18n.t('compute.disable_bind_eip')
- return ret
- }
- ret.validate = cloudEnabled('bindEip', obj)
- ret.tooltip = cloudUnabledTip('bindEip', obj)
- return ret
- },
- hidden: () => !(hasSetupKey(['onecloud', 'cloudpods'])),
- },
- // 解绑eip
- {
- label: i18n.t('compute.text_1264'),
- permission: 'server_perform_dissociate_eip',
- action: () => {
- this.createDialog('VmUnbindEipDialog', {
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- refresh: this.refresh,
- })
- },
- meta: () => {
- const ret = {
- validate: false,
- tooltip: null,
- }
- const rescueModeValid = validateRescueMode(obj)
- if (!rescueModeValid.validate) return rescueModeValid
- if (commonUnabled(obj)) return ret
- if (obj.eip_mode !== 'elastic_ip') {
- ret.tooltip = i18n.t('compute.text_1293')
- return ret
- }
- if (obj.eip_mode === 'public_ip') {
- ret.tooltip = i18n.t('compute.text_1294')
- return ret
- }
- ret.validate = cloudEnabled('unbindEip', obj)
- ret.tooltip = cloudUnabledTip('unbindEip', obj)
- return ret
- },
- hidden: () => !(hasSetupKey(['onecloud', 'cloudpods'])),
- },
- ],
- },
- {
- label: i18n.t('compute.perform_delete'),
- submenus: [
- // 设置删除保护
- disableDeleteAction(Object.assign(this, {}), {
- name: i18n.t('compute.vminstance-container'),
- meta: () => {
- const ret = { validate: true }
- return ret
- },
- }),
- // 删除
- {
- label: i18n.t('compute.perform_delete'),
- action: () => {
- this.createDialog('DeleteVmContainerDialog', {
- vm: this,
- data: [obj],
- columns: this.columns,
- onManager: this.onManager,
- title: i18n.t('compute.perform_delete'),
- success: () => {
- this.destroySidePages()
- },
- })
- },
- meta: () => {
- return this.$getDeleteResult(obj)
- },
- },
- ],
- },
- ]
- },
- meta: (obj) => {
- let ret = {
- validate: true,
- tooltip: null,
- }
- ret = this.$isValidateResourceLock(obj)
- return ret
- },
- },
- ]
- }
- export default {
- // name: POLICY_RES_NAME_KEY_MAP.vminstance.key,
- getSingleActions,
- }
|