From b05155f4b9978525528a0b0a8c4e92d27bec7190 Mon Sep 17 00:00:00 2001 From: Dajahi Wiley Date: Thu, 4 Dec 2025 16:30:16 -0500 Subject: [PATCH 1/2] Prop drilling to make FW inbound and outbound rules available in FirewallRuleSetForm; filter out ruleset from dropdown if it is already present in the FW inbound and outbound rules --- .../FirewallDetail/Rules/FirewallRuleDrawer.test.tsx | 1 + .../FirewallDetail/Rules/FirewallRuleDrawer.tsx | 2 ++ .../FirewallDetail/Rules/FirewallRuleDrawer.types.ts | 2 ++ .../FirewallDetail/Rules/FirewallRuleSetForm.tsx | 11 +++++++++-- .../FirewallDetail/Rules/FirewallRulesLanding.tsx | 4 ++++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.test.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.test.tsx index 57b88c41801..d407c2a3521 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.test.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.test.tsx @@ -60,6 +60,7 @@ const props: FirewallRuleDrawerProps = { category: 'inbound', isOpen: true, mode: 'create', + inboundAndOutboundRules: [], handleOpenPrefixListDrawer: mockHandleOpenPrefixListDrawer, onClose: mockOnClose, onSubmit: mockOnSubmit, diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.tsx index ec7d525a2f0..1d297556918 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.tsx @@ -47,6 +47,7 @@ export const FirewallRuleDrawer = React.memo( isOpen, mode, onClose, + inboundAndOutboundRules, ruleToModifyOrView, } = props; @@ -303,6 +304,7 @@ export const FirewallRuleDrawer = React.memo( 'ruleset' ); }} + inboundAndOutboundRules={inboundAndOutboundRules} ruleErrors={ruleToModifyOrView?.errors} {...formikProps} /> diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.types.ts b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.types.ts index bd09e974484..b3ded393408 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.types.ts +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.types.ts @@ -18,6 +18,7 @@ export interface FirewallRuleDrawerProps { plRuleRef: PrefixListRuleReference, contextType: PrefixListDrawerContext['type'] ) => void; + inboundAndOutboundRules: FirewallRuleType[]; isOpen: boolean; mode: FirewallRuleDrawerMode; onClose: () => void; @@ -67,5 +68,6 @@ export interface FirewallRuleSetFormProps prefixListLabel: string, plRuleRef: PrefixListRuleReference ) => void; + inboundAndOutboundRules: FirewallRuleType[]; ruleErrors?: FirewallRuleError[]; } diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleSetForm.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleSetForm.tsx index a07f89d38cc..1fec51c09c6 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleSetForm.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleSetForm.tsx @@ -27,13 +27,14 @@ export const FirewallRuleSetForm = React.memo( (props: FirewallRuleSetFormProps) => { const { category, + closeDrawer, errors, handleOpenPrefixListDrawer, handleSubmit, + inboundAndOutboundRules, setFieldTouched, setFieldValue, touched, - closeDrawer, values, } = props; @@ -59,7 +60,13 @@ export const FirewallRuleSetForm = React.memo( () => ruleSets // TODO: Firewall RuleSets: Remove this client-side filter once the API supports filtering by the 'type' field - .filter((ruleSet) => ruleSet.type === category) // Display only rule sets applicable to the given category + .filter( + (ruleSet) => + ruleSet.type === category && + !inboundAndOutboundRules.some( + (rule) => rule.ruleset === ruleSet.id + ) + ) // Display only rule sets applicable to the given category and filter out rule sets already referenced by the FW .map((ruleSet) => ({ label: ruleSet.label, value: ruleSet.id, diff --git a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRulesLanding.tsx b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRulesLanding.tsx index f72ac14d99c..517d7d90aeb 100644 --- a/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRulesLanding.tsx +++ b/packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRulesLanding.tsx @@ -547,6 +547,10 @@ export const FirewallRulesLanding = React.memo((props: Props) => { modeViewedFrom: ruleDrawer.mode, }); }} + inboundAndOutboundRules={[ + ...(rules.inbound ?? []), + ...(rules.outbound ?? []), + ]} isOpen={ location.pathname.endsWith('add/inbound') || location.pathname.endsWith('add/outbound') || From 48be348904c9b12693808f215ae070c5184acd15 Mon Sep 17 00:00:00 2001 From: Dajahi Wiley Date: Thu, 4 Dec 2025 16:48:52 -0500 Subject: [PATCH 2/2] Added changeset: Ensure a firewall can only reference a RuleSet once --- .../.changeset/pr-13169-upcoming-features-1764884932241.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/manager/.changeset/pr-13169-upcoming-features-1764884932241.md diff --git a/packages/manager/.changeset/pr-13169-upcoming-features-1764884932241.md b/packages/manager/.changeset/pr-13169-upcoming-features-1764884932241.md new file mode 100644 index 00000000000..c7d3a1b5e6f --- /dev/null +++ b/packages/manager/.changeset/pr-13169-upcoming-features-1764884932241.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Upcoming Features +--- + +Ensure a firewall can only reference a RuleSet once ([#13169](https://github.com/linode/manager/pull/13169))