diff --git a/packages/manager/.changeset/pr-12420-upcoming-features-1750750290252.md b/packages/manager/.changeset/pr-12420-upcoming-features-1750750290252.md new file mode 100644 index 00000000000..3ff9317a770 --- /dev/null +++ b/packages/manager/.changeset/pr-12420-upcoming-features-1750750290252.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Upcoming Features +--- + +Add support for `nodebalancerIpv6` feature flag for NodeBalancer Dual Stack Support ([#12420](https://github.com/linode/manager/pull/12420)) diff --git a/packages/manager/src/dev-tools/FeatureFlagTool.tsx b/packages/manager/src/dev-tools/FeatureFlagTool.tsx index 11612a33de2..f6321654cef 100644 --- a/packages/manager/src/dev-tools/FeatureFlagTool.tsx +++ b/packages/manager/src/dev-tools/FeatureFlagTool.tsx @@ -34,6 +34,7 @@ const options: { flag: keyof Flags; label: string }[] = [ { flag: 'linodeInterfaces', label: 'Linode Interfaces' }, { flag: 'lkeEnterprise', label: 'LKE-Enterprise' }, { flag: 'mtc2025', label: 'MTC 2025' }, + { flag: 'nodebalancerIpv6', label: 'NodeBalancer Dual Stack (IPv6)' }, { flag: 'nodebalancerVpc', label: 'NodeBalancer-VPC Integration' }, { flag: 'objMultiCluster', label: 'OBJ Multi-Cluster' }, { flag: 'objectStorageGen2', label: 'OBJ Gen2' }, diff --git a/packages/manager/src/featureFlags.ts b/packages/manager/src/featureFlags.ts index 5dd2a4c1821..969cc6c6a03 100644 --- a/packages/manager/src/featureFlags.ts +++ b/packages/manager/src/featureFlags.ts @@ -147,6 +147,7 @@ export interface Flags { marketplaceAppOverrides: MarketplaceAppOverride[]; metadata: boolean; mtc2025: boolean; + nodebalancerIpv6: boolean; nodebalancerVpc: boolean; objectStorageGen2: BaseFeatureFlag; objMultiCluster: boolean; diff --git a/packages/manager/src/features/NodeBalancers/utils.test.ts b/packages/manager/src/features/NodeBalancers/utils.test.ts index b207693537d..d212bb9d6d5 100644 --- a/packages/manager/src/features/NodeBalancers/utils.test.ts +++ b/packages/manager/src/features/NodeBalancers/utils.test.ts @@ -2,7 +2,10 @@ import { renderHook, waitFor } from '@testing-library/react'; import { wrapWithTheme } from 'src/utilities/testHelpers'; -import { useIsNodebalancerVPCEnabled } from './utils'; +import { + useIsNodebalancerIpv6Enabled, + useIsNodebalancerVPCEnabled, +} from './utils'; describe('useIsNodebalancerVPCEnabled', () => { it('returns true if the feature is enabled', async () => { @@ -29,3 +32,29 @@ describe('useIsNodebalancerVPCEnabled', () => { }); }); }); + +describe('useIsNodebalancerIpv6Enabled', () => { + it('returns true if the feature is enabled', async () => { + const options = { flags: { nodebalancerIpv6: true } }; + + const { result } = renderHook(() => useIsNodebalancerIpv6Enabled(), { + wrapper: (ui) => wrapWithTheme(ui, options), + }); + + await waitFor(() => { + expect(result.current.isNodebalancerIpv6Enabled).toBe(true); + }); + }); + + it('returns false if the feature is NOT enabled', async () => { + const options = { flags: { nodebalancerIpv6: false } }; + + const { result } = renderHook(() => useIsNodebalancerIpv6Enabled(), { + wrapper: (ui) => wrapWithTheme(ui, options), + }); + + await waitFor(() => { + expect(result.current.isNodebalancerIpv6Enabled).toBe(false); + }); + }); +}); diff --git a/packages/manager/src/features/NodeBalancers/utils.ts b/packages/manager/src/features/NodeBalancers/utils.ts index 656a1150163..474478d4f10 100644 --- a/packages/manager/src/features/NodeBalancers/utils.ts +++ b/packages/manager/src/features/NodeBalancers/utils.ts @@ -234,3 +234,19 @@ export const useIsNodebalancerVPCEnabled = () => { return { isNodebalancerVPCEnabled: flags.nodebalancerVpc ?? false }; }; + +/** + * Returns whether or not features related to the NodeBalancer Dual Stack project + * should be enabled. + * + * Currently, this just uses the `nodebalancerIPv6` feature flag as a source of truth, + * but will eventually also look at account capabilities. + */ + +export const useIsNodebalancerIpv6Enabled = () => { + const flags = useFlags(); + + // @TODO NB-IPv6: check for customer tag/account capability when it exists + + return { isNodebalancerIpv6Enabled: flags.nodebalancerIpv6 ?? false }; +};