Skip to content

Commit aa06582

Browse files
dwiley-akamaiDevDWpmakode-akamai
authored
upcoming: [M3-10713] – Create & use new JSON-based Firewall RuleSets & Prefix Lists feature flag (#13125)
* Add JSON-based feature flag for Firewall RuleSets and Prefix Lists feature; update useIsFirewallRulesetsPrefixlistsEnabled() to use new feature flag accordingly * Remove old feature flag that is now obsolete * Added changeset: Use new JSON-based fwRulesetsPrefixLists feature flag for Firewall RuleSets and Prefix Lists feature --------- Co-authored-by: Dajahi Wiley <[email protected]> Co-authored-by: pmakode-akamai <[email protected]>
1 parent 3fd1215 commit aa06582

File tree

11 files changed

+83
-30
lines changed

11 files changed

+83
-30
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@linode/manager": Upcoming Features
3+
---
4+
5+
Use new JSON-based fwRulesetsPrefixLists feature flag for Firewall RuleSets and Prefix Lists feature ([#13125](https://github.com/linode/manager/pull/13125))

packages/manager/src/dev-tools/FeatureFlagTool.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ const options: { flag: keyof Flags; label: string }[] = [
3131
{ flag: 'cloudNat', label: 'Cloud NAT' },
3232
{ flag: 'disableLargestGbPlans', label: 'Disable Largest GB Plans' },
3333
{
34-
flag: 'firewallRulesetsPrefixlists',
35-
label: 'Firewall Rulesets & Prefixlists',
34+
flag: 'fwRulesetsPrefixLists',
35+
label: 'Firewall RuleSets and Prefix Lists (JSON-based)',
3636
},
3737
{ flag: 'gecko2', label: 'Gecko' },
3838
{ flag: 'generationalPlansv2', label: 'Generational compute plans' },

packages/manager/src/featureFlags.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,11 @@ interface MTC {
171171
supportedRegions: Region['id'][];
172172
}
173173

174+
interface FirewallRulesetsAndPrefixLists extends BetaFeatureFlag {
175+
ga: boolean;
176+
la: boolean;
177+
}
178+
174179
export interface Flags {
175180
acceleratedPlans: AcceleratedPlansFlag;
176181
aclp: AclpFlag;
@@ -200,7 +205,7 @@ export interface Flags {
200205
dbaasV2: BetaFeatureFlag;
201206
dbaasV2MonitorMetrics: BetaFeatureFlag;
202207
disableLargestGbPlans: boolean;
203-
firewallRulesetsPrefixlists: boolean;
208+
fwRulesetsPrefixLists: FirewallRulesetsAndPrefixLists;
204209
gecko2: GeckoFeatureFlag;
205210
generationalPlansv2: GenerationalPlansFlag;
206211
gpuv2: GpuV2;

packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.test.tsx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,12 @@ const spy = vi.spyOn(shared, 'useIsFirewallRulesetsPrefixlistsEnabled');
6767

6868
describe('AddRuleDrawer', () => {
6969
it('renders the title', () => {
70-
spy.mockReturnValue({ isFirewallRulesetsPrefixlistsEnabled: false });
70+
spy.mockReturnValue({
71+
isFirewallRulesetsPrefixlistsFeatureEnabled: false,
72+
isFirewallRulesetsPrefixListsBetaEnabled: false,
73+
isFirewallRulesetsPrefixListsLAEnabled: false,
74+
isFirewallRulesetsPrefixListsGAEnabled: false,
75+
});
7176

7277
const { getByText } = renderWithTheme(
7378
<FirewallRuleDrawer {...props} category="inbound" mode="create" />
@@ -98,7 +103,12 @@ describe('AddRuleDrawer', () => {
98103

99104
describe('AddRuleSetDrawer', () => {
100105
beforeEach(() => {
101-
spy.mockReturnValue({ isFirewallRulesetsPrefixlistsEnabled: true });
106+
spy.mockReturnValue({
107+
isFirewallRulesetsPrefixlistsFeatureEnabled: true,
108+
isFirewallRulesetsPrefixListsBetaEnabled: false,
109+
isFirewallRulesetsPrefixListsLAEnabled: false,
110+
isFirewallRulesetsPrefixListsGAEnabled: false,
111+
});
102112
});
103113

104114
it('renders the drawer title', () => {
@@ -171,7 +181,12 @@ describe('AddRuleSetDrawer', () => {
171181

172182
describe('ViewRuleSetDetailsDrawer', () => {
173183
beforeEach(() => {
174-
spy.mockReturnValue({ isFirewallRulesetsPrefixlistsEnabled: true });
184+
spy.mockReturnValue({
185+
isFirewallRulesetsPrefixlistsFeatureEnabled: true,
186+
isFirewallRulesetsPrefixListsBetaEnabled: false,
187+
isFirewallRulesetsPrefixListsLAEnabled: false,
188+
isFirewallRulesetsPrefixListsGAEnabled: false,
189+
});
175190
});
176191

177192
const activeRuleSet = firewallRuleSetFactory.build({ id: 123 });

packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export const FirewallRuleDrawer = React.memo(
4141
(props: FirewallRuleDrawerProps) => {
4242
const { category, isOpen, mode, onClose, ruleToModifyOrView } = props;
4343

44-
const { isFirewallRulesetsPrefixlistsEnabled } =
44+
const { isFirewallRulesetsPrefixlistsFeatureEnabled } =
4545
useIsFirewallRulesetsPrefixlistsEnabled();
4646

4747
/**
@@ -82,21 +82,21 @@ export const FirewallRuleDrawer = React.memo(
8282
// 2. The drawer is closed - ensures the next time it opens, it starts with the default 'rule' selection.
8383
if (
8484
mode === 'create' &&
85-
(!isFirewallRulesetsPrefixlistsEnabled || !isOpen)
85+
(!isFirewallRulesetsPrefixlistsFeatureEnabled || !isOpen)
8686
) {
8787
setCreateEntityType('rule');
8888
}
8989
}, [
9090
mode,
9191
isOpen,
9292
ruleToModifyOrView,
93-
isFirewallRulesetsPrefixlistsEnabled,
93+
isFirewallRulesetsPrefixlistsFeatureEnabled,
9494
]);
9595

9696
const title =
9797
mode === 'create'
9898
? `Add an ${capitalize(category)} Rule${
99-
isFirewallRulesetsPrefixlistsEnabled ? ' or Rule Set' : ''
99+
isFirewallRulesetsPrefixlistsFeatureEnabled ? ' or Rule Set' : ''
100100
}`
101101
: mode === 'edit'
102102
? 'Edit Rule'
@@ -160,7 +160,7 @@ export const FirewallRuleDrawer = React.memo(
160160

161161
return (
162162
<Drawer onClose={onClose} open={isOpen} title={title}>
163-
{mode === 'create' && isFirewallRulesetsPrefixlistsEnabled && (
163+
{mode === 'create' && isFirewallRulesetsPrefixlistsFeatureEnabled && (
164164
<Grid container spacing={2}>
165165
{firewallRuleCreateOptions.map((option) => (
166166
<SelectionCard
@@ -229,7 +229,7 @@ export const FirewallRuleDrawer = React.memo(
229229

230230
{mode === 'create' &&
231231
createEntityType === 'ruleset' &&
232-
isFirewallRulesetsPrefixlistsEnabled && (
232+
isFirewallRulesetsPrefixlistsFeatureEnabled && (
233233
<Formik<FormRuleSetState>
234234
initialValues={{ ruleset: -1 }}
235235
onSubmit={(values) => {

packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleSetDetailsView.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export const FirewallRuleSetDetailsView = (
4141
) => {
4242
const { category, closeDrawer, ruleset } = props;
4343

44-
const { isFirewallRulesetsPrefixlistsEnabled } =
44+
const { isFirewallRulesetsPrefixlistsFeatureEnabled } =
4545
useIsFirewallRulesetsPrefixlistsEnabled();
4646
const { classes } = useStyles();
4747

@@ -54,7 +54,7 @@ export const FirewallRuleSetDetailsView = (
5454
error,
5555
} = useFirewallRuleSetQuery(
5656
ruleset ?? -1,
57-
isValidRuleSetId && isFirewallRulesetsPrefixlistsEnabled
57+
isValidRuleSetId && isFirewallRulesetsPrefixlistsFeatureEnabled
5858
);
5959

6060
if (!isValidRuleSetId) {

packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleSetForm.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ export const FirewallRuleSetForm = React.memo(
3838

3939
const { classes } = useStyles();
4040

41-
const { isFirewallRulesetsPrefixlistsEnabled } =
41+
const { isFirewallRulesetsPrefixlistsFeatureEnabled } =
4242
useIsFirewallRulesetsPrefixlistsEnabled();
4343

4444
const { data, error, isLoading } = useAllFirewallRuleSetsQuery(
45-
isFirewallRulesetsPrefixlistsEnabled
45+
isFirewallRulesetsPrefixlistsFeatureEnabled
4646
);
4747

4848
const ruleSets = data ?? [];

packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleTable.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,12 +310,12 @@ const FirewallRuleTableRow = React.memo((props: FirewallRuleTableRowProps) => {
310310
ruleset,
311311
} = props;
312312

313-
const { isFirewallRulesetsPrefixlistsEnabled } =
313+
const { isFirewallRulesetsPrefixlistsFeatureEnabled } =
314314
useIsFirewallRulesetsPrefixlistsEnabled();
315315

316316
const isRuleSetRow = Boolean(ruleset);
317317
const isRuleSetRowEnabled =
318-
isRuleSetRow && isFirewallRulesetsPrefixlistsEnabled;
318+
isRuleSetRow && isFirewallRulesetsPrefixlistsFeatureEnabled;
319319

320320
const isValidRuleSetId = ruleset !== undefined && ruleset !== null;
321321

packages/manager/src/features/Firewalls/FirewallLanding/FirewallLanding.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ const FirewallLanding = () => {
7575
const [isModalOpen, setIsModalOpen] = React.useState<boolean>(false);
7676
const [dialogMode, setDialogMode] = React.useState<Mode>('enable');
7777
const [isGenerateDialogOpen, setIsGenerateDialogOpen] = React.useState(false);
78-
const { isFirewallRulesetsPrefixlistsEnabled } =
78+
const { isFirewallRulesetsPrefixlistsFeatureEnabled } =
7979
useIsFirewallRulesetsPrefixlistsEnabled();
8080

8181
const rulesColumnTooltipText =
@@ -208,7 +208,7 @@ const FirewallLanding = () => {
208208
<Hidden smDown>
209209
<TableCell sx={{ width: '15%' }}>
210210
Rules
211-
{isFirewallRulesetsPrefixlistsEnabled && (
211+
{isFirewallRulesetsPrefixlistsFeatureEnabled && (
212212
<TooltipIcon
213213
status="info"
214214
sxTooltipIcon={{

packages/manager/src/features/Firewalls/shared.test.ts

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,16 @@ describe('generateAddressLabel', () => {
152152

153153
describe('useIsFirewallRulesetsPrefixlistsEnabled', () => {
154154
it('returns true if the feature is enabled', async () => {
155-
const options = { flags: { firewallRulesetsPrefixlists: true } };
155+
const options = {
156+
flags: {
157+
fwRulesetsPrefixLists: {
158+
enabled: true,
159+
beta: false,
160+
la: false,
161+
ga: false,
162+
},
163+
},
164+
};
156165

157166
const { result } = renderHook(
158167
() => useIsFirewallRulesetsPrefixlistsEnabled(),
@@ -162,12 +171,23 @@ describe('useIsFirewallRulesetsPrefixlistsEnabled', () => {
162171
);
163172

164173
await waitFor(() => {
165-
expect(result.current.isFirewallRulesetsPrefixlistsEnabled).toBe(true);
174+
expect(result.current.isFirewallRulesetsPrefixlistsFeatureEnabled).toBe(
175+
true
176+
);
166177
});
167178
});
168179

169180
it('returns false if the feature is NOT enabled', async () => {
170-
const options = { flags: { firewallRulesetsPrefixlists: false } };
181+
const options = {
182+
flags: {
183+
fwRulesetsPrefixLists: {
184+
enabled: false,
185+
beta: false,
186+
la: false,
187+
ga: false,
188+
},
189+
},
190+
};
171191

172192
const { result } = renderHook(
173193
() => useIsFirewallRulesetsPrefixlistsEnabled(),
@@ -177,7 +197,9 @@ describe('useIsFirewallRulesetsPrefixlistsEnabled', () => {
177197
);
178198

179199
await waitFor(() => {
180-
expect(result.current.isFirewallRulesetsPrefixlistsEnabled).toBe(false);
200+
expect(result.current.isFirewallRulesetsPrefixlistsFeatureEnabled).toBe(
201+
false
202+
);
181203
});
182204
});
183205
});

0 commit comments

Comments
 (0)