fix: label the VPC group of subnets without a VPC as None (#1210)

Kube-OVN sets a subnet's VPC (ovn-cluster when none is given), but a
subnet it hasn't processed, such as one with an invalid provider, has
none. The VPC page grouped those under "Virtual Private Cloud:" with an
empty name, and its Create Subnet, Topology and actions buttons pointed
at no VPC.

Show None as the VPC name for that group and leave out its VPC buttons.

Signed-off-by: Marcelo Fukumoto <marcelo.fukumoto@suse.com>
(cherry picked from commit 77b643540e)
This commit is contained in:
Marcelo Fukumoto
2026-11-09 17:33:32 +01:00
parent 3322162d9a
commit 9479b066be
2 changed files with 60 additions and 2 deletions
@@ -0,0 +1,54 @@
import { mount } from '@vue/test-utils';
import HarvesterVPC from '../kubeovn.io.vpc.vue';
// A table that renders the page's group header for each of the given groups
function resourceTable(groups) {
return {
data: () => ({ groups }),
template: '<div><div v-for="group in groups" :key="group.key" class="group"><slot name="group-by" :group="group" /></div></div>',
};
}
function mountList(groups) {
return mount(HarvesterVPC, {
props: { schema: { id: 'kubeovn.io.vpc' } },
data: () => ({ enabledKubeOvnAddon: true }),
global: {
stubs: {
ResourceTable: resourceTable(groups),
Masthead: true,
Loading: true,
'router-link': { template: '<a><slot /></a>' },
},
mocks: {
$fetchState: { pending: false },
t: (key) => ({ 'harvester.vpc.label': 'Virtual Private Cloud', 'generic.none': 'None' }[key] || key),
$store: {
getters: {
currentProduct: { inStore: 'harvester' },
'harvester/all': () => [],
'harvester/schemaFor': () => ({ collectionMethods: ['POST'] }),
},
},
},
},
});
}
describe('list: kubeovn.io.vpc', () => {
it('should label a group of subnets without a VPC as None and offer no VPC actions', () => {
const wrapper = mountList([{ key: '' }]);
const group = wrapper.find('.group');
expect(group.find('.group-tab').text()).toBe('Virtual Private Cloud: None');
expect(group.find('.right').exists()).toBe(false);
});
it('should label a VPC group with its name and offer the VPC actions', () => {
const wrapper = mountList([{ key: 'ovn-cluster' }]);
const group = wrapper.find('.group');
expect(group.find('.group-tab').text()).toBe('Virtual Private Cloud: ovn-cluster');
expect(group.findAll('.right a, .right button')).toHaveLength(3);
});
});
+6 -2
View File
@@ -139,7 +139,8 @@ export default {
},
methods: {
groupLabel(group) {
return `${ this.t('harvester.vpc.label') }: ${ group.key }`;
// Kube-OVN sets a subnet's VPC (ovn-cluster when none is given), so an empty one is a subnet it hasn't processed
return `${ this.t('harvester.vpc.label') }: ${ group.key || this.t('generic.none') }`;
},
slotName(vpc) {
@@ -226,7 +227,10 @@ export default {
{{ groupLabel(group) }}
</span>
</div>
<div class="right">
<div
v-if="group.key"
class="right"
>
<router-link
v-if="isSubnetCreatable"
class="btn btn-sm role-secondary mr-5"