Skip to content

Commit 078d171

Browse files
authored
Add firewall rules column to VPCs table (#2218)
add firewall rules column to vpcs table
1 parent d212867 commit 078d171

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

app/pages/project/vpcs/VpcsPage.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router-dom'
1212
import {
1313
apiQueryClient,
1414
useApiMutation,
15+
useApiQuery,
1516
useApiQueryClient,
1617
usePrefetchedApiQuery,
1718
type Vpc,
@@ -21,7 +22,8 @@ import { Networking16Icon, Networking24Icon } from '@oxide/design-system/icons/r
2122
import { DocsPopover } from '~/components/DocsPopover'
2223
import { getProjectSelector, useProjectSelector, useQuickActions } from '~/hooks'
2324
import { confirmDelete } from '~/stores/confirm-delete'
24-
import { makeLinkCell } from '~/table/cells/LinkCell'
25+
import { SkeletonCell } from '~/table/cells/EmptyCell'
26+
import { LinkCell, makeLinkCell } from '~/table/cells/LinkCell'
2527
import { getActionsCol, type MenuAction } from '~/table/columns/action-col'
2628
import { Columns } from '~/table/columns/common'
2729
import { PAGE_SIZE, useQueryTable } from '~/table/QueryTable'
@@ -51,6 +53,14 @@ export const VpcDocsPopover = () => (
5153
/>
5254
)
5355

56+
const FirewallRuleCount = ({ project, vpc }: { project: string; vpc: string }) => {
57+
const { data } = useApiQuery('vpcFirewallRulesView', { query: { project, vpc } })
58+
59+
if (!data) return <SkeletonCell /> // loading
60+
61+
return <LinkCell to={pb.vpc({ project, vpc })}>{data.rules.length}</LinkCell>
62+
}
63+
5464
const colHelper = createColumnHelper<Vpc>()
5565

5666
// just as in the vpcList call for the quick actions menu, include limit to make
@@ -120,6 +130,10 @@ export function VpcsPage() {
120130
}),
121131
colHelper.accessor('dnsName', { header: 'DNS name' }),
122132
colHelper.accessor('description', Columns.description),
133+
colHelper.accessor('name', {
134+
header: 'Firewall Rules',
135+
cell: (info) => <FirewallRuleCount project={project} vpc={info.getValue()} />,
136+
}),
123137
colHelper.accessor('timeCreated', Columns.timeCreated),
124138
getActionsCol(makeActions),
125139
],

test/e2e/vpcs.e2e.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,36 @@
77
*/
88
import { expect, test } from '@playwright/test'
99

10+
import { expectRowVisible } from './utils'
11+
1012
test('can nav to VpcPage from /', async ({ page }) => {
1113
await page.goto('/')
1214
await page.getByRole('table').getByRole('link', { name: 'mock-project' }).click()
1315
await page.getByRole('link', { name: 'VPCs' }).click()
16+
17+
await expectRowVisible(page.getByRole('table'), {
18+
name: 'mock-vpc',
19+
'DNS name': 'mock-vpc',
20+
description: 'a fake vpc',
21+
'Firewall Rules': '4',
22+
})
23+
24+
// click the vpc name cell to go there
1425
await page.getByRole('link', { name: 'mock-vpc' }).click()
15-
await expect(page.getByText('Jan 1, 202112:00 AM')).toBeVisible()
26+
27+
await expect(page.getByRole('heading', { name: 'mock-vpc' })).toBeVisible()
1628
await expect(page.getByRole('tab', { name: 'Firewall rules' })).toBeVisible()
1729
await expect(page.getByRole('cell', { name: 'allow-icmp' })).toBeVisible()
18-
expect(await page.title()).toEqual('mock-vpc / VPCs / mock-project / Oxide Console')
30+
await expect(page).toHaveURL('/projects/mock-project/vpcs/mock-vpc')
31+
await expect(page).toHaveTitle('mock-vpc / VPCs / mock-project / Oxide Console')
32+
33+
// we can also click the firewall rules cell to get to the VPC detail
34+
await page.goBack()
35+
await expect(page.getByRole('heading', { name: 'mock-vpc' })).toBeHidden()
36+
await expect(page.getByRole('cell', { name: 'allow-icmp' })).toBeHidden()
37+
await page.getByRole('link', { name: '4' }).click()
38+
await expect(page.getByRole('heading', { name: 'mock-vpc' })).toBeVisible()
39+
await expect(page.getByRole('cell', { name: 'allow-icmp' })).toBeVisible()
1940
})
2041

2142
test('can create and delete subnet', async ({ page }) => {

0 commit comments

Comments
 (0)