blob: 03b56fab2ee4c720e3d177e891f19e46b2dc7a5c [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
<template>
<div>
<autogen-view @change-resource="changeResource">
<template #action>
<action-button
:style="{ float: device === 'mobile' ? 'left' : 'right' }"
:loading="loading"
:actions="actions"
:selectedRowKeys="selectedRowKeys"
:dataView="true"
:resource="resource"
@exec-action="(action) => execAction(action, action.groupAction && !dataView)" />
</template>
<template #resource>
<resource-view
v-if="isPublicIpAddress && 'id' in resource"
:loading="loading"
:resource="resource"
:historyTab="activeTab"
:tabs="tabs"
@onTabChange="(tab) => { activeTab = tab }" />
</template>
</autogen-view>
</div>
</template>
<script>
import { shallowRef, defineAsyncComponent } from 'vue'
import { api } from '@api'
import { mixinDevice } from '@/utils/mixin.js'
import eventBus from '@/config/eventBus'
import AutogenView from '@/views/AutogenView.vue'
import ResourceView from '@/components/view/ResourceView'
import ActionButton from '@/components/view/ActionButton'
export default {
name: 'PublicIpResource',
components: {
AutogenView,
ResourceView,
ActionButton
},
data () {
return {
loading: false,
selectedRowKeys: [],
actions: [],
resource: {},
tabs: [{
name: 'details',
component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue')))
},
{
name: 'events',
resourceType: 'IpAddress',
component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))),
show: () => { return 'listEvents' in this.$store.getters.apis }
}],
defaultTabs: [{
name: 'details',
component: shallowRef(defineAsyncComponent(() => import('@/components/view/DetailsTab.vue')))
},
{
name: 'events',
resourceType: 'IpAddress',
component: shallowRef(defineAsyncComponent(() => import('@/components/view/EventsTab.vue'))),
show: () => { return 'listEvents' in this.$store.getters.apis }
},
{
name: 'comments',
component: shallowRef(defineAsyncComponent(() => import('@/components/view/AnnotationsTab.vue')))
}],
activeTab: ''
}
},
mixins: [mixinDevice],
provide: function () {
return {
parentFetchData: this.fetchData(),
parentToggleLoading: this.toggleLoading
}
},
computed: {
isPublicIpAddress () {
return this.$route.path.startsWith('/publicip') && this.$route.path.includes('/publicip/')
}
},
watch: {
resource: {
deep: true,
handler () {
if ('id' in this.resource) {
this.fetchData()
}
}
}
},
created () {
if ('id' in this.resource) {
this.fetchData()
}
},
methods: {
async fetchData () {
if (Object.keys(this.resource).length === 0) {
return
}
this.loading = true
await this.filterTabs()
await this.fetchAction()
this.loading = false
},
async filterTabs () {
// Public IPs in Free state have nothing
if (['Free', 'Reserved'].includes(this.resource.state)) {
this.tabs = this.defaultTabs
return
}
// VPC IPs with source nat have only VPN
if (this.resource && this.resource.vpcid && this.resource.issourcenat) {
this.tabs = this.defaultTabs.concat(this.$route.meta.tabs.filter(tab => tab.name === 'vpn'))
return
}
// VPC IPs with vpnenabled have only VPN
if (this.resource && this.resource.vpcid && this.resource.vpnenabled) {
this.tabs = this.defaultTabs.concat(this.$route.meta.tabs.filter(tab => tab.name === 'vpn'))
return
}
// VPC IPs with static nat have nothing
if (this.resource && this.resource.vpcid && this.resource.isstaticnat) {
return
}
if (this.resource && this.resource.vpcid) {
// VPC IPs don't have firewall
let tabs = this.$route.meta.tabs.filter(tab => tab.name !== 'firewall')
const network = await this.fetchNetwork()
if (network && network.networkofferingconservemode) {
this.tabs = tabs
return
}
this.portFWRuleCount = await this.fetchPortFWRule()
this.loadBalancerRuleCount = await this.fetchLoadBalancerRule()
// VPC IPs with PF only have PF
if (this.portFWRuleCount > 0) {
tabs = tabs.filter(tab => tab.name !== 'loadbalancing')
}
// VPC IPs with LB rules only have LB
if (this.loadBalancerRuleCount > 0) {
tabs = tabs.filter(tab => tab.name !== 'portforwarding')
}
this.tabs = tabs
return
}
// Regular guest networks with Source Nat have everything
if (this.resource && !this.resource.vpcid && this.resource.issourcenat) {
this.tabs = this.$route.meta.tabs
return
}
// Regular guest networks with Static Nat only have Firewall
if (this.resource && !this.resource.vpcid && this.resource.isstaticnat) {
this.tabs = this.defaultTabs.concat(this.$route.meta.tabs.filter(tab => tab.name === 'firewall'))
return
}
// Regular guest networks have all tabs
if (this.resource && !this.resource.vpcid) {
this.tabs = this.$route.meta.tabs
}
},
fetchAction () {
this.actions = this.$route.meta.actions || []
},
fetchNetwork () {
return new Promise((resolve, reject) => {
api('listNetworks', {
listAll: true,
projectid: this.resource.projectid,
id: this.resource.associatednetworkid
}).then(json => {
const network = json.listnetworksresponse?.network?.[0] || null
resolve(network)
}).catch(e => {
reject(e)
})
})
},
fetchPortFWRule () {
return new Promise((resolve, reject) => {
api('listPortForwardingRules', {
listAll: true,
ipaddressid: this.resource.id,
page: 1,
pagesize: 1
}).then(json => {
const portFWRuleCount = json.listportforwardingrulesresponse.count || 0
resolve(portFWRuleCount)
}).catch(e => {
reject(e)
})
})
},
fetchLoadBalancerRule () {
return new Promise((resolve, reject) => {
api('listLoadBalancerRules', {
listAll: true,
publicipid: this.resource.id,
page: 1,
pagesize: 1
}).then(json => {
const loadBalancerRuleCount = json.listloadbalancerrulesresponse.count || 0
resolve(loadBalancerRuleCount)
}).catch(e => {
reject(e)
})
})
},
changeResource (resource) {
console.log(resource)
this.resource = resource
},
toggleLoading () {
this.loading = !this.loading
},
execAction (action, isGroupAction) {
eventBus.emit('exec-action', { action, isGroupAction })
}
}
}
</script>