From 6b0dcb192916370c9820da59a1bec73064f95309 Mon Sep 17 00:00:00 2001 From: Connie Liu Date: Thu, 23 Jan 2025 12:12:36 -0500 Subject: [PATCH 01/11] update firewall template endpoints --- packages/api-v4/src/firewalls/firewalls.ts | 4 ++-- packages/api-v4/src/firewalls/types.ts | 9 ++++++++- .../useCreateFirewallFromTemplate.ts | 17 ++++++++++++----- packages/manager/src/factories/firewalls.ts | 14 +++++++++++++- packages/manager/src/queries/firewalls.ts | 3 ++- 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/packages/api-v4/src/firewalls/firewalls.ts b/packages/api-v4/src/firewalls/firewalls.ts index 6b247ce7eac..6fe5f1e2e85 100644 --- a/packages/api-v4/src/firewalls/firewalls.ts +++ b/packages/api-v4/src/firewalls/firewalls.ts @@ -19,6 +19,7 @@ import { FirewallDevicePayload, FirewallRules, FirewallTemplate, + FirewallTemplateSlug, UpdateFirewallPayload, } from './types'; @@ -262,9 +263,8 @@ export const getTemplates = () => * getTemplate * * Get a specific firewall template by its slug. - * */ -export const getTemplate = (templateSlug: string) => +export const getTemplate = (templateSlug: FirewallTemplateSlug) => Request( setMethod('GET'), setURL( diff --git a/packages/api-v4/src/firewalls/types.ts b/packages/api-v4/src/firewalls/types.ts index 53bd059841b..c1a2385dbfb 100644 --- a/packages/api-v4/src/firewalls/types.ts +++ b/packages/api-v4/src/firewalls/types.ts @@ -23,10 +23,12 @@ export interface Firewall { } export interface FirewallRules { + fingerprint?: string; inbound?: FirewallRuleType[] | null; outbound?: FirewallRuleType[] | null; inbound_policy: FirewallPolicyType; outbound_policy: FirewallPolicyType; + version?: number; } export interface FirewallRuleType { @@ -55,8 +57,13 @@ export interface FirewallDevice { entity: FirewallDeviceEntity; } +export type FirewallTemplateSlug = + | 'akamai-non-prod' + | 'vpc_basic' + | 'public_basic'; + export interface FirewallTemplate { - slug: string; + slug: FirewallTemplateSlug; rules: FirewallRules; } diff --git a/packages/manager/src/components/GenerateFirewallDialog/useCreateFirewallFromTemplate.ts b/packages/manager/src/components/GenerateFirewallDialog/useCreateFirewallFromTemplate.ts index 814ff4bac84..434c4f04cd0 100644 --- a/packages/manager/src/components/GenerateFirewallDialog/useCreateFirewallFromTemplate.ts +++ b/packages/manager/src/components/GenerateFirewallDialog/useCreateFirewallFromTemplate.ts @@ -4,13 +4,17 @@ import { firewallQueries } from 'src/queries/firewalls'; import { useCreateFirewall } from 'src/queries/firewalls'; import type { DialogState } from './GenerateFirewallDialog'; -import type { CreateFirewallPayload, Firewall } from '@linode/api-v4'; +import type { + CreateFirewallPayload, + Firewall, + FirewallTemplateSlug, +} from '@linode/api-v4'; import type { QueryClient } from '@tanstack/react-query'; export const useCreateFirewallFromTemplate = (options: { onFirewallGenerated?: (firewall: Firewall) => void; setDialogState: (state: DialogState) => void; - templateSlug: string; + templateSlug: FirewallTemplateSlug; }) => { const { onFirewallGenerated, setDialogState, templateSlug } = options; const queryClient = useQueryClient(); @@ -44,7 +48,7 @@ export const useCreateFirewallFromTemplate = (options: { const createFirewallFromTemplate = async (options: { createFirewall: (firewall: CreateFirewallPayload) => Promise; queryClient: QueryClient; - templateSlug: string; + templateSlug: FirewallTemplateSlug; updateProgress: (progress: number | undefined) => void; }): Promise => { const { createFirewall, queryClient, templateSlug, updateProgress } = options; @@ -66,7 +70,7 @@ const createFirewallFromTemplate = async (options: { }; const getUniqueFirewallLabel = ( - templateSlug: string, + templateSlug: FirewallTemplateSlug, firewalls: Firewall[] ) => { let iterator = 1; @@ -79,7 +83,10 @@ const getUniqueFirewallLabel = ( return firewallLabelFromSlug(templateSlug, iterator); }; -const firewallLabelFromSlug = (slug: string, iterator: number) => { +const firewallLabelFromSlug = ( + slug: FirewallTemplateSlug, + iterator: number +) => { const MAX_LABEL_LENGTH = 32; const iteratorSuffix = `-${iterator}`; return ( diff --git a/packages/manager/src/factories/firewalls.ts b/packages/manager/src/factories/firewalls.ts index dfd962df981..f648a990ee8 100644 --- a/packages/manager/src/factories/firewalls.ts +++ b/packages/manager/src/factories/firewalls.ts @@ -7,6 +7,7 @@ import type { FirewallRuleType, FirewallRules, FirewallTemplate, + FirewallTemplateSlug, } from '@linode/api-v4/lib/firewalls/types'; export const firewallRuleFactory = Factory.Sync.makeFactory({ @@ -58,9 +59,20 @@ export const firewallDeviceFactory = Factory.Sync.makeFactory({ updated: '2020-01-01', }); +const firewallTemplateSlugs: FirewallTemplateSlug[] = [ + 'akamai-non-prod', + 'vpc_basic', + 'public_basic', +]; + export const firewallTemplateFactory = Factory.Sync.makeFactory( { rules: firewallRulesFactory.build(), - slug: Factory.each((i) => `template-${i}`), + slug: Factory.each((_) => { + const randomIndex = Math.floor( + Math.random() * firewallTemplateSlugs.length + ); + return firewallTemplateSlugs[randomIndex]; + }), } ); diff --git a/packages/manager/src/queries/firewalls.ts b/packages/manager/src/queries/firewalls.ts index d018281c790..cf8e6beb8f4 100644 --- a/packages/manager/src/queries/firewalls.ts +++ b/packages/manager/src/queries/firewalls.ts @@ -34,6 +34,7 @@ import type { FirewallDevicePayload, FirewallRules, FirewallTemplate, + FirewallTemplateSlug, Params, ResourcePage, } from '@linode/api-v4'; @@ -84,7 +85,7 @@ export const firewallQueries = createQueryKeys('firewalls', { }, queryKey: null, }, - template: (slug: string) => ({ + template: (slug: FirewallTemplateSlug) => ({ queryFn: () => getTemplate(slug), queryKey: [slug], }), From ea620a98b0a495fda0a5872eae55d88f3bf0a62d Mon Sep 17 00:00:00 2001 From: Connie Liu Date: Thu, 23 Jan 2025 13:14:59 -0500 Subject: [PATCH 02/11] existing /networking endpoints and fix resulting type errors --- packages/api-v4/src/firewalls/firewalls.ts | 25 +++++++++++++++++++ packages/api-v4/src/firewalls/types.ts | 25 +++++++++++++------ packages/api-v4/src/networking/types.ts | 6 +++++ packages/manager/src/factories/linodes.ts | 3 +++ packages/manager/src/factories/networking.ts | 4 ++- .../features/Events/factories/firewall.tsx | 1 + .../Devices/FirewallDeviceLanding.tsx | 1 + 7 files changed, 57 insertions(+), 8 deletions(-) diff --git a/packages/api-v4/src/firewalls/firewalls.ts b/packages/api-v4/src/firewalls/firewalls.ts index 6fe5f1e2e85..389c47b7726 100644 --- a/packages/api-v4/src/firewalls/firewalls.ts +++ b/packages/api-v4/src/firewalls/firewalls.ts @@ -18,9 +18,11 @@ import { FirewallDevice, FirewallDevicePayload, FirewallRules, + FirewallSettings, FirewallTemplate, FirewallTemplateSlug, UpdateFirewallPayload, + UpdateFirewallSettings, } from './types'; /** @@ -246,6 +248,29 @@ export const deleteFirewallDevice = (firewallID: number, deviceID: number) => ) ); +/** + * getFirewallSettings + * + * Returns current interface default firewall settings (alongside linode and nodebalancer defaults) + */ +export const getFirewallSettings = () => + Request( + setMethod('GET'), + setURL(`${BETA_API_ROOT}/networking/firewalls/settings`) + ); + +/** + * getTemplate + * + * Update which firewalls should be the interface default firewalls + */ +export const updateFirewallSettings = (data: UpdateFirewallSettings) => + Request( + setMethod('PUT'), + setURL(`${BETA_API_ROOT}/networking/firewalls/settings`), + setData(data) // TODO CONNIE ADD SCHEMA HERE + ); + // #region Templates /** diff --git a/packages/api-v4/src/firewalls/types.ts b/packages/api-v4/src/firewalls/types.ts index c1a2385dbfb..008175d520a 100644 --- a/packages/api-v4/src/firewalls/types.ts +++ b/packages/api-v4/src/firewalls/types.ts @@ -2,7 +2,7 @@ export type FirewallStatus = 'enabled' | 'disabled' | 'deleted'; export type FirewallRuleProtocol = 'ALL' | 'TCP' | 'UDP' | 'ICMP' | 'IPENCAP'; -export type FirewallDeviceEntityType = 'linode' | 'nodebalancer'; +export type FirewallDeviceEntityType = 'linode' | 'nodebalancer' | 'interface'; export type FirewallPolicyType = 'ACCEPT' | 'DROP'; @@ -14,12 +14,7 @@ export interface Firewall { rules: FirewallRules; created: string; updated: string; - entities: { - id: number; - type: FirewallDeviceEntityType; - label: string; - url: string; - }[]; + entities: FirewallDeviceEntity[]; } export interface FirewallRules { @@ -74,6 +69,7 @@ export interface CreateFirewallPayload { devices?: { linodes?: number[]; nodebalancers?: number[]; + interfaces?: number[]; }; } @@ -87,3 +83,18 @@ export interface FirewallDevicePayload { id: number; type: FirewallDeviceEntityType; } + +export interface DefaultFirewallIDs { + interface_vpc: number; + interface_public: number; + linode: number; + nodebalancer: number; +} + +export interface FirewallSettings { + default_firewall_ids: DefaultFirewallIDs; +} + +export interface UpdateFirewallSettings { + default_firewall_ids: Partial; +} diff --git a/packages/api-v4/src/networking/types.ts b/packages/api-v4/src/networking/types.ts index 7a0d9d5d18b..3cd9d30642d 100644 --- a/packages/api-v4/src/networking/types.ts +++ b/packages/api-v4/src/networking/types.ts @@ -7,7 +7,13 @@ export interface IPAddress { public: boolean; rdns: string | null; linode_id: number; + interface_id: number; region: string; + vpc_nat_1_1?: { + address: string; + subnet_id: number; + vpc_id: number; + } | null; } export interface IPRangeBaseData { diff --git a/packages/manager/src/factories/linodes.ts b/packages/manager/src/factories/linodes.ts index b6c0e921ccf..a043bc660cf 100644 --- a/packages/manager/src/factories/linodes.ts +++ b/packages/manager/src/factories/linodes.ts @@ -71,6 +71,7 @@ export const linodeIPFactory = Factory.Sync.makeFactory({ { address: '10.11.12.13', gateway: '10.11.12.13', + interface_id: 1, linode_id: 1, prefix: 24, public: true, @@ -95,6 +96,7 @@ export const linodeIPFactory = Factory.Sync.makeFactory({ link_local: { address: '2001:DB8::0000', gateway: 'fe80::1', + interface_id: 1, linode_id: 1, prefix: 64, public: false, @@ -106,6 +108,7 @@ export const linodeIPFactory = Factory.Sync.makeFactory({ slaac: { address: '2001:DB8::0000', gateway: 'fe80::1', + interface_id: 1, linode_id: 1, prefix: 64, public: true, diff --git a/packages/manager/src/factories/networking.ts b/packages/manager/src/factories/networking.ts index 74a29840383..157a1579930 100644 --- a/packages/manager/src/factories/networking.ts +++ b/packages/manager/src/factories/networking.ts @@ -1,9 +1,11 @@ -import { IPAddress } from '@linode/api-v4/lib/networking'; import Factory from 'src/factories/factoryProxy'; +import type { IPAddress } from '@linode/api-v4/lib/networking'; + export const ipAddressFactory = Factory.Sync.makeFactory({ address: Factory.each((id) => `192.168.1.${id}`), gateway: Factory.each((id) => `192.168.1.${id + 1}`), + interface_id: Factory.each((id) => id), linode_id: Factory.each((id) => id), prefix: 24, public: true, diff --git a/packages/manager/src/features/Events/factories/firewall.tsx b/packages/manager/src/features/Events/factories/firewall.tsx index 41fcbf8a6ba..6fce84172d3 100644 --- a/packages/manager/src/features/Events/factories/firewall.tsx +++ b/packages/manager/src/features/Events/factories/firewall.tsx @@ -9,6 +9,7 @@ const secondaryFirewallEntityNameMap: Record< FirewallDeviceEntityType, string > = { + interface: 'Interface', linode: 'Linode', nodebalancer: 'NodeBalancer', }; diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.tsx index 202336a8e08..4d811d95fa6 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.tsx @@ -23,6 +23,7 @@ export interface FirewallDeviceLandingProps { } export const formattedTypes = { + interface: 'Interface', // @Todo Linode Interface: double check this when working on UI tickets linode: 'Linode', nodebalancer: 'NodeBalancer', }; From 4ecb67d7912e88bc993b37e51d605dc4311e585c Mon Sep 17 00:00:00 2001 From: Connie Liu Date: Thu, 23 Jan 2025 15:19:24 -0500 Subject: [PATCH 03/11] add changesets, fix some types --- .../pr-11559-upcoming-features-1737663229326.md | 5 +++++ packages/api-v4/src/firewalls/firewalls.ts | 3 ++- packages/api-v4/src/firewalls/types.ts | 2 +- packages/api-v4/src/networking/types.ts | 2 +- .../pr-11559-upcoming-features-1737663548624.md | 5 +++++ packages/manager/src/factories/linodes.ts | 6 +++--- .../pr-11559-upcoming-features-1737663268651.md | 5 +++++ packages/validation/src/firewalls.schema.ts | 9 +++++++++ 8 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 packages/api-v4/.changeset/pr-11559-upcoming-features-1737663229326.md create mode 100644 packages/manager/.changeset/pr-11559-upcoming-features-1737663548624.md create mode 100644 packages/validation/.changeset/pr-11559-upcoming-features-1737663268651.md diff --git a/packages/api-v4/.changeset/pr-11559-upcoming-features-1737663229326.md b/packages/api-v4/.changeset/pr-11559-upcoming-features-1737663229326.md new file mode 100644 index 00000000000..42410c8bbb5 --- /dev/null +++ b/packages/api-v4/.changeset/pr-11559-upcoming-features-1737663229326.md @@ -0,0 +1,5 @@ +--- +"@linode/api-v4": Upcoming Features +--- + +Add and update `/v4/networking` endpoints and types for Linode Interfaces ([#11559](https://github.com/linode/manager/pull/11559)) diff --git a/packages/api-v4/src/firewalls/firewalls.ts b/packages/api-v4/src/firewalls/firewalls.ts index 389c47b7726..38ba8c455b5 100644 --- a/packages/api-v4/src/firewalls/firewalls.ts +++ b/packages/api-v4/src/firewalls/firewalls.ts @@ -11,6 +11,7 @@ import { CreateFirewallSchema, FirewallDeviceSchema, UpdateFirewallSchema, + UpdateFirewallSettingsSchema, } from '@linode/validation/lib/firewalls.schema'; import { CreateFirewallPayload, @@ -268,7 +269,7 @@ export const updateFirewallSettings = (data: UpdateFirewallSettings) => Request( setMethod('PUT'), setURL(`${BETA_API_ROOT}/networking/firewalls/settings`), - setData(data) // TODO CONNIE ADD SCHEMA HERE + setData(data, UpdateFirewallSettingsSchema) ); // #region Templates diff --git a/packages/api-v4/src/firewalls/types.ts b/packages/api-v4/src/firewalls/types.ts index 008175d520a..1206bd4d288 100644 --- a/packages/api-v4/src/firewalls/types.ts +++ b/packages/api-v4/src/firewalls/types.ts @@ -85,8 +85,8 @@ export interface FirewallDevicePayload { } export interface DefaultFirewallIDs { - interface_vpc: number; interface_public: number; + interface_vpc: number; linode: number; nodebalancer: number; } diff --git a/packages/api-v4/src/networking/types.ts b/packages/api-v4/src/networking/types.ts index 3cd9d30642d..9508ff35f88 100644 --- a/packages/api-v4/src/networking/types.ts +++ b/packages/api-v4/src/networking/types.ts @@ -7,7 +7,7 @@ export interface IPAddress { public: boolean; rdns: string | null; linode_id: number; - interface_id: number; + interface_id: number | null; region: string; vpc_nat_1_1?: { address: string; diff --git a/packages/manager/.changeset/pr-11559-upcoming-features-1737663548624.md b/packages/manager/.changeset/pr-11559-upcoming-features-1737663548624.md new file mode 100644 index 00000000000..4ec404a509e --- /dev/null +++ b/packages/manager/.changeset/pr-11559-upcoming-features-1737663548624.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Upcoming Features +--- + +Fix type errors that result from changes to `/v4/networking` endpoints ([#11559](https://github.com/linode/manager/pull/11559)) diff --git a/packages/manager/src/factories/linodes.ts b/packages/manager/src/factories/linodes.ts index a043bc660cf..af72125d529 100644 --- a/packages/manager/src/factories/linodes.ts +++ b/packages/manager/src/factories/linodes.ts @@ -71,7 +71,7 @@ export const linodeIPFactory = Factory.Sync.makeFactory({ { address: '10.11.12.13', gateway: '10.11.12.13', - interface_id: 1, + interface_id: null, linode_id: 1, prefix: 24, public: true, @@ -96,7 +96,7 @@ export const linodeIPFactory = Factory.Sync.makeFactory({ link_local: { address: '2001:DB8::0000', gateway: 'fe80::1', - interface_id: 1, + interface_id: null, linode_id: 1, prefix: 64, public: false, @@ -108,7 +108,7 @@ export const linodeIPFactory = Factory.Sync.makeFactory({ slaac: { address: '2001:DB8::0000', gateway: 'fe80::1', - interface_id: 1, + interface_id: null, linode_id: 1, prefix: 64, public: true, diff --git a/packages/validation/.changeset/pr-11559-upcoming-features-1737663268651.md b/packages/validation/.changeset/pr-11559-upcoming-features-1737663268651.md new file mode 100644 index 00000000000..9b253a4232a --- /dev/null +++ b/packages/validation/.changeset/pr-11559-upcoming-features-1737663268651.md @@ -0,0 +1,5 @@ +--- +"@linode/validation": Upcoming Features +--- + +Add `UpdateFirewallSettingsSchema`for Linode Interfaces project ([#11559](https://github.com/linode/manager/pull/11559)) diff --git a/packages/validation/src/firewalls.schema.ts b/packages/validation/src/firewalls.schema.ts index bdf5c3e1b80..d3c5a423586 100644 --- a/packages/validation/src/firewalls.schema.ts +++ b/packages/validation/src/firewalls.schema.ts @@ -198,3 +198,12 @@ export const FirewallDeviceSchema = object({ .required('Device type is required.'), id: number().required('ID is required.'), }); + +export const UpdateFirewallSettingsSchema = object({ + default_firewall_ids: object({ + interface_public: number(), + interface_vpc: number(), + linode: number(), + nodebalancer: number(), + }), +}); From f2efad0c78c8959ad86197adab2d4fbcd275bd0b Mon Sep 17 00:00:00 2001 From: Connie Liu Date: Thu, 23 Jan 2025 15:54:49 -0500 Subject: [PATCH 04/11] update types --- packages/api-v4/src/firewalls/firewalls.ts | 2 +- packages/api-v4/src/firewalls/types.ts | 5 +---- packages/manager/src/factories/firewalls.ts | 4 ++-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/api-v4/src/firewalls/firewalls.ts b/packages/api-v4/src/firewalls/firewalls.ts index 38ba8c455b5..8ac14aefe3c 100644 --- a/packages/api-v4/src/firewalls/firewalls.ts +++ b/packages/api-v4/src/firewalls/firewalls.ts @@ -252,7 +252,7 @@ export const deleteFirewallDevice = (firewallID: number, deviceID: number) => /** * getFirewallSettings * - * Returns current interface default firewall settings (alongside linode and nodebalancer defaults) + * Returns current interface default firewall settings */ export const getFirewallSettings = () => Request( diff --git a/packages/api-v4/src/firewalls/types.ts b/packages/api-v4/src/firewalls/types.ts index 1206bd4d288..a1ee5f6ab80 100644 --- a/packages/api-v4/src/firewalls/types.ts +++ b/packages/api-v4/src/firewalls/types.ts @@ -52,10 +52,7 @@ export interface FirewallDevice { entity: FirewallDeviceEntity; } -export type FirewallTemplateSlug = - | 'akamai-non-prod' - | 'vpc_basic' - | 'public_basic'; +export type FirewallTemplateSlug = 'akamai-non-prod' | 'vpc' | 'public'; export interface FirewallTemplate { slug: FirewallTemplateSlug; diff --git a/packages/manager/src/factories/firewalls.ts b/packages/manager/src/factories/firewalls.ts index f648a990ee8..b147f7bb822 100644 --- a/packages/manager/src/factories/firewalls.ts +++ b/packages/manager/src/factories/firewalls.ts @@ -61,8 +61,8 @@ export const firewallDeviceFactory = Factory.Sync.makeFactory({ const firewallTemplateSlugs: FirewallTemplateSlug[] = [ 'akamai-non-prod', - 'vpc_basic', - 'public_basic', + 'vpc', + 'public', ]; export const firewallTemplateFactory = Factory.Sync.makeFactory( From f16b77dbe21b38fe866aee86fec85a0ccf7d59ad Mon Sep 17 00:00:00 2001 From: Connie Liu <139280159+coliu-akamai@users.noreply.github.com> Date: Fri, 24 Jan 2025 12:23:26 -0500 Subject: [PATCH 05/11] Update packages/manager/src/factories/firewalls.ts Co-authored-by: Banks Nussman <115251059+bnussman-akamai@users.noreply.github.com> --- packages/manager/src/factories/firewalls.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/manager/src/factories/firewalls.ts b/packages/manager/src/factories/firewalls.ts index b147f7bb822..fe99f127ab8 100644 --- a/packages/manager/src/factories/firewalls.ts +++ b/packages/manager/src/factories/firewalls.ts @@ -68,11 +68,6 @@ const firewallTemplateSlugs: FirewallTemplateSlug[] = [ export const firewallTemplateFactory = Factory.Sync.makeFactory( { rules: firewallRulesFactory.build(), - slug: Factory.each((_) => { - const randomIndex = Math.floor( - Math.random() * firewallTemplateSlugs.length - ); - return firewallTemplateSlugs[randomIndex]; - }), + slug: 'akamai-non-prod', } ); From ab3f5ae77410c6e89a74e4de3c169a011893dc5a Mon Sep 17 00:00:00 2001 From: Connie Liu Date: Fri, 24 Jan 2025 12:30:22 -0500 Subject: [PATCH 06/11] add comment for follow up, remove unneeded constant --- packages/api-v4/src/firewalls/types.ts | 1 + packages/manager/src/factories/firewalls.ts | 7 ------- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/api-v4/src/firewalls/types.ts b/packages/api-v4/src/firewalls/types.ts index a1ee5f6ab80..9c8be992533 100644 --- a/packages/api-v4/src/firewalls/types.ts +++ b/packages/api-v4/src/firewalls/types.ts @@ -17,6 +17,7 @@ export interface Firewall { entities: FirewallDeviceEntity[]; } +// @TODO Linode Interfaces - follow up on a separate type for firewall template's rules export interface FirewallRules { fingerprint?: string; inbound?: FirewallRuleType[] | null; diff --git a/packages/manager/src/factories/firewalls.ts b/packages/manager/src/factories/firewalls.ts index fe99f127ab8..804b27961b7 100644 --- a/packages/manager/src/factories/firewalls.ts +++ b/packages/manager/src/factories/firewalls.ts @@ -7,7 +7,6 @@ import type { FirewallRuleType, FirewallRules, FirewallTemplate, - FirewallTemplateSlug, } from '@linode/api-v4/lib/firewalls/types'; export const firewallRuleFactory = Factory.Sync.makeFactory({ @@ -59,12 +58,6 @@ export const firewallDeviceFactory = Factory.Sync.makeFactory({ updated: '2020-01-01', }); -const firewallTemplateSlugs: FirewallTemplateSlug[] = [ - 'akamai-non-prod', - 'vpc', - 'public', -]; - export const firewallTemplateFactory = Factory.Sync.makeFactory( { rules: firewallRulesFactory.build(), From 1052278435c64d5718e49dba6a46dc4d71084aa5 Mon Sep 17 00:00:00 2001 From: Connie Liu Date: Mon, 27 Jan 2025 12:08:46 -0500 Subject: [PATCH 07/11] new type for FirewallTemplate rules + todo comment --- packages/api-v4/src/firewalls/firewalls.ts | 6 +++++- packages/api-v4/src/firewalls/types.ts | 14 +++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/api-v4/src/firewalls/firewalls.ts b/packages/api-v4/src/firewalls/firewalls.ts index 8ac14aefe3c..777348cf5a4 100644 --- a/packages/api-v4/src/firewalls/firewalls.ts +++ b/packages/api-v4/src/firewalls/firewalls.ts @@ -23,6 +23,7 @@ import { FirewallTemplate, FirewallTemplateSlug, UpdateFirewallPayload, + UpdateFirewallRules, UpdateFirewallSettings, } from './types'; @@ -154,7 +155,10 @@ export const getFirewallRules = ( * Updates the inbound and outbound Rules for a Firewall. Using this endpoint will * replace all of a Firewall's ruleset with the Rules specified in your request. */ -export const updateFirewallRules = (firewallID: number, data: FirewallRules) => +export const updateFirewallRules = ( + firewallID: number, + data: UpdateFirewallRules +) => Request( setMethod('PUT'), setData(data), // Validation is too complicated for these; leave it to the API. diff --git a/packages/api-v4/src/firewalls/types.ts b/packages/api-v4/src/firewalls/types.ts index 9c8be992533..95fe171ff98 100644 --- a/packages/api-v4/src/firewalls/types.ts +++ b/packages/api-v4/src/firewalls/types.ts @@ -17,7 +17,6 @@ export interface Firewall { entities: FirewallDeviceEntity[]; } -// @TODO Linode Interfaces - follow up on a separate type for firewall template's rules export interface FirewallRules { fingerprint?: string; inbound?: FirewallRuleType[] | null; @@ -27,6 +26,15 @@ export interface FirewallRules { version?: number; } +export type UpdateFirewallRules = Omit< + FirewallRules, + 'fingerprint' | 'version' +>; + +// @TODO Linode Interfaces - follow up on if FirewallTemplate rules have the fingerprint / version fields. +// FirewallRules do, but the objects returned from the getFirewallTemplate requests don't +export type FirewallTemplateRules = UpdateFirewallRules; + export interface FirewallRuleType { label?: string | null; description?: string | null; @@ -57,13 +65,13 @@ export type FirewallTemplateSlug = 'akamai-non-prod' | 'vpc' | 'public'; export interface FirewallTemplate { slug: FirewallTemplateSlug; - rules: FirewallRules; + rules: FirewallTemplateRules; } export interface CreateFirewallPayload { label?: string; tags?: string[]; - rules: FirewallRules; + rules: UpdateFirewallRules; devices?: { linodes?: number[]; nodebalancers?: number[]; From 9c5476b19d2577d16e103a49923f5c9c7be77127 Mon Sep 17 00:00:00 2001 From: Connie Liu Date: Mon, 27 Jan 2025 13:09:25 -0500 Subject: [PATCH 08/11] update fields/types for Firewall Rules - double check query updates... --- packages/api-v4/src/firewalls/types.ts | 4 +-- .../firewalls/firewall-rule-table.spec.tsx | 8 ++++++ packages/manager/src/__data__/firewalls.ts | 4 +++ .../GenerateFirewallDialog.test.tsx | 28 ++++++++++++++++--- packages/manager/src/factories/firewalls.ts | 14 +++++++++- packages/manager/src/queries/firewalls.ts | 10 +++---- 6 files changed, 56 insertions(+), 12 deletions(-) diff --git a/packages/api-v4/src/firewalls/types.ts b/packages/api-v4/src/firewalls/types.ts index 95fe171ff98..507320d9d08 100644 --- a/packages/api-v4/src/firewalls/types.ts +++ b/packages/api-v4/src/firewalls/types.ts @@ -18,12 +18,12 @@ export interface Firewall { } export interface FirewallRules { - fingerprint?: string; + fingerprint: string; inbound?: FirewallRuleType[] | null; outbound?: FirewallRuleType[] | null; inbound_policy: FirewallPolicyType; outbound_policy: FirewallPolicyType; - version?: number; + version: number; } export type UpdateFirewallRules = Omit< diff --git a/packages/manager/cypress/component/features/firewalls/firewall-rule-table.spec.tsx b/packages/manager/cypress/component/features/firewalls/firewall-rule-table.spec.tsx index f686299fcde..5cedacb9062 100644 --- a/packages/manager/cypress/component/features/firewalls/firewall-rule-table.spec.tsx +++ b/packages/manager/cypress/component/features/firewalls/firewall-rule-table.spec.tsx @@ -418,9 +418,11 @@ componentTests('Firewall Rules Table', (mount) => { mount( { mount( { mount( { mount( { it('Can successfully generate a firewall', async () => { const firewalls = firewallFactory.buildList(2); - const template = firewallTemplateFactory.build(); + const template = firewallTemplateFactory.build({ + rules: { + // due to an updated firewallTemplateFactory, we need to specify values for this test + inbound: [ + firewallRuleFactory.build({ + description: 'firewall-rule-1 description', + label: 'firewall-rule-1', + }), + ], + outbound: [ + firewallRuleFactory.build({ + description: 'firewall-rule-2 description', + label: 'firewall-rule-2', + }), + ], + }, + }); const createFirewallCallback = vi.fn(); const onClose = vi.fn(); const onFirewallGenerated = vi.fn(); @@ -55,14 +75,14 @@ describe('GenerateFirewallButton', () => { expect(onFirewallGenerated).toHaveBeenCalledWith( expect.objectContaining({ label: `${template.slug}-1`, - rules: template.rules, + rules: { ...template.rules, fingerprint: '8a545843', version: 1 }, }) ); expect(createFirewallCallback).toHaveBeenCalledWith( expect.objectContaining({ label: `${template.slug}-1`, - rules: template.rules, + rules: { ...template.rules, fingerprint: '8a545843', version: 1 }, }) ); }); diff --git a/packages/manager/src/factories/firewalls.ts b/packages/manager/src/factories/firewalls.ts index 804b27961b7..c9aeffa94ec 100644 --- a/packages/manager/src/factories/firewalls.ts +++ b/packages/manager/src/factories/firewalls.ts @@ -7,6 +7,7 @@ import type { FirewallRuleType, FirewallRules, FirewallTemplate, + FirewallTemplateRules, } from '@linode/api-v4/lib/firewalls/types'; export const firewallRuleFactory = Factory.Sync.makeFactory({ @@ -22,12 +23,23 @@ export const firewallRuleFactory = Factory.Sync.makeFactory({ }); export const firewallRulesFactory = Factory.Sync.makeFactory({ + fingerprint: '8a545843', inbound: firewallRuleFactory.buildList(1), inbound_policy: 'DROP', outbound: firewallRuleFactory.buildList(1), outbound_policy: 'ACCEPT', + version: 1, }); +export const firewallTemplateRulesFactory = Factory.Sync.makeFactory( + { + inbound: firewallRuleFactory.buildList(1), + inbound_policy: 'DROP', + outbound: firewallRuleFactory.buildList(1), + outbound_policy: 'ACCEPT', + } +); + export const firewallFactory = Factory.Sync.makeFactory({ created: '2020-01-01 00:00:00', entities: [ @@ -60,7 +72,7 @@ export const firewallDeviceFactory = Factory.Sync.makeFactory({ export const firewallTemplateFactory = Factory.Sync.makeFactory( { - rules: firewallRulesFactory.build(), + rules: firewallTemplateRulesFactory.build(), slug: 'akamai-non-prod', } ); diff --git a/packages/manager/src/queries/firewalls.ts b/packages/manager/src/queries/firewalls.ts index cf8e6beb8f4..9341ff42916 100644 --- a/packages/manager/src/queries/firewalls.ts +++ b/packages/manager/src/queries/firewalls.ts @@ -32,11 +32,11 @@ import type { Firewall, FirewallDevice, FirewallDevicePayload, - FirewallRules, FirewallTemplate, FirewallTemplateSlug, Params, ResourcePage, + UpdateFirewallRules, } from '@linode/api-v4'; import type { EventHandlerData } from 'src/hooks/useEventHandlers'; @@ -336,7 +336,7 @@ export const useDeleteFirewall = (id: number) => { export const useUpdateFirewallRulesMutation = (firewallId: number) => { const queryClient = useQueryClient(); - return useMutation({ + return useMutation({ mutationFn: (data) => updateFirewallRules(firewallId, data), onSuccess(updatedRules) { // Update rules on specific firewall @@ -346,7 +346,7 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { if (!oldData) { return undefined; } - return { ...oldData, rules: updatedRules }; + return { ...oldData, rules: { ...oldData.rules, ...updatedRules } }; } ); @@ -373,7 +373,7 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { newData[indexOfFirewall] = { ...firewall, - rules: updatedRules, + rules: { ...firewall.rules, ...updatedRules }, }; return { ...page, data: newData }; } @@ -402,7 +402,7 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { newFirewalls[indexOfFirewall] = { ...firewall, - rules: updatedRules, + rules: { ...firewall.rules, ...updatedRules }, }; return newFirewalls; From 1054436e6bb7b9b56d74232121c8c55a684914c1 Mon Sep 17 00:00:00 2001 From: Connie Liu Date: Mon, 27 Jan 2025 15:21:36 -0500 Subject: [PATCH 09/11] update versioning in updateFirewallRules query cache --- packages/manager/src/queries/firewalls.ts | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/manager/src/queries/firewalls.ts b/packages/manager/src/queries/firewalls.ts index 9341ff42916..9190c6f6d3d 100644 --- a/packages/manager/src/queries/firewalls.ts +++ b/packages/manager/src/queries/firewalls.ts @@ -346,7 +346,14 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { if (!oldData) { return undefined; } - return { ...oldData, rules: { ...oldData.rules, ...updatedRules } }; + return { + ...oldData, + rules: { + ...oldData.rules, + ...updatedRules, + version: oldData.rules.version + 1, + }, + }; } ); @@ -373,7 +380,11 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { newData[indexOfFirewall] = { ...firewall, - rules: { ...firewall.rules, ...updatedRules }, + rules: { + ...firewall.rules, + ...updatedRules, + version: firewall.rules.version + 1, + }, }; return { ...page, data: newData }; } @@ -402,7 +413,11 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { newFirewalls[indexOfFirewall] = { ...firewall, - rules: { ...firewall.rules, ...updatedRules }, + rules: { + ...firewall.rules, + ...updatedRules, + version: firewall.rules.version + 1, + }, }; return newFirewalls; From ddd0ced53f91525f70ac35fe4e5aa858ae1a3efe Mon Sep 17 00:00:00 2001 From: Connie Liu Date: Mon, 27 Jan 2025 16:50:02 -0500 Subject: [PATCH 10/11] bruh (at myself!!!) --- packages/manager/src/queries/firewalls.ts | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/packages/manager/src/queries/firewalls.ts b/packages/manager/src/queries/firewalls.ts index 9190c6f6d3d..48e0b51f565 100644 --- a/packages/manager/src/queries/firewalls.ts +++ b/packages/manager/src/queries/firewalls.ts @@ -32,6 +32,7 @@ import type { Firewall, FirewallDevice, FirewallDevicePayload, + FirewallRules, FirewallTemplate, FirewallTemplateSlug, Params, @@ -336,7 +337,7 @@ export const useDeleteFirewall = (id: number) => { export const useUpdateFirewallRulesMutation = (firewallId: number) => { const queryClient = useQueryClient(); - return useMutation({ + return useMutation({ mutationFn: (data) => updateFirewallRules(firewallId, data), onSuccess(updatedRules) { // Update rules on specific firewall @@ -348,11 +349,7 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { } return { ...oldData, - rules: { - ...oldData.rules, - ...updatedRules, - version: oldData.rules.version + 1, - }, + rules: updatedRules, }; } ); @@ -380,11 +377,7 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { newData[indexOfFirewall] = { ...firewall, - rules: { - ...firewall.rules, - ...updatedRules, - version: firewall.rules.version + 1, - }, + rules: updatedRules, }; return { ...page, data: newData }; } @@ -413,11 +406,7 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { newFirewalls[indexOfFirewall] = { ...firewall, - rules: { - ...firewall.rules, - ...updatedRules, - version: firewall.rules.version + 1, - }, + rules: updatedRules, }; return newFirewalls; From ffb8d728e1c8b9665375b964fe91b71edd454f95 Mon Sep 17 00:00:00 2001 From: Connie Liu Date: Mon, 27 Jan 2025 17:03:38 -0500 Subject: [PATCH 11/11] update comments --- packages/api-v4/src/firewalls/firewalls.ts | 2 +- packages/manager/src/queries/firewalls.ts | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/api-v4/src/firewalls/firewalls.ts b/packages/api-v4/src/firewalls/firewalls.ts index 777348cf5a4..7b5671110ff 100644 --- a/packages/api-v4/src/firewalls/firewalls.ts +++ b/packages/api-v4/src/firewalls/firewalls.ts @@ -265,7 +265,7 @@ export const getFirewallSettings = () => ); /** - * getTemplate + * updateFirewallSettings * * Update which firewalls should be the interface default firewalls */ diff --git a/packages/manager/src/queries/firewalls.ts b/packages/manager/src/queries/firewalls.ts index 48e0b51f565..d1b978cde35 100644 --- a/packages/manager/src/queries/firewalls.ts +++ b/packages/manager/src/queries/firewalls.ts @@ -347,10 +347,7 @@ export const useUpdateFirewallRulesMutation = (firewallId: number) => { if (!oldData) { return undefined; } - return { - ...oldData, - rules: updatedRules, - }; + return { ...oldData, rules: updatedRules }; } );