diff --git a/packages/api-v4/.changeset/pr-12594-upcoming-features-1753822524437.md b/packages/api-v4/.changeset/pr-12594-upcoming-features-1753822524437.md
new file mode 100644
index 00000000000..70306b85364
--- /dev/null
+++ b/packages/api-v4/.changeset/pr-12594-upcoming-features-1753822524437.md
@@ -0,0 +1,5 @@
+---
+"@linode/api-v4": Upcoming Features
+---
+
+Add type and update cluster payload and interface to support optional stack_type field for LKE-E ([#12594](https://github.com/linode/manager/pull/12594))
diff --git a/packages/api-v4/src/kubernetes/types.ts b/packages/api-v4/src/kubernetes/types.ts
index b9774c3abec..5eea395460d 100644
--- a/packages/api-v4/src/kubernetes/types.ts
+++ b/packages/api-v4/src/kubernetes/types.ts
@@ -13,6 +13,8 @@ export type Label = {
export type NodePoolUpdateStrategy = 'on_recycle' | 'rolling_update';
+export type KubernetesStackType = 'ipv4' | 'ipv4-ipv6';
+
export interface Taint {
effect: KubernetesTaintEffect;
key: string;
@@ -27,6 +29,11 @@ export interface KubernetesCluster {
k8s_version: string;
label: string;
region: string;
+ /**
+ * Upcoming Feature Notice - LKE-E:** this property may not be available to all customers
+ * and may change in subsequent releases.
+ */
+ stack_type?: KubernetesStackType;
status: string; // @todo enum this
/**
* Upcoming Feature Notice - LKE-E:** this property may not be available to all customers
@@ -147,5 +154,6 @@ export interface CreateKubeClusterPayload {
label?: string; // Label will be assigned by the API if not provided
node_pools: CreateNodePoolDataBeta[];
region?: string; // Will be caught by Yup if undefined
+ stack_type?: KubernetesStackType; // For LKE-E; will default to 'ipv4'
tier?: KubernetesTier; // For LKE-E: Will be assigned 'standard' by the API if not provided
}
diff --git a/packages/manager/.changeset/pr-12594-upcoming-features-1753822274393.md b/packages/manager/.changeset/pr-12594-upcoming-features-1753822274393.md
new file mode 100644
index 00000000000..77a2fca159b
--- /dev/null
+++ b/packages/manager/.changeset/pr-12594-upcoming-features-1753822274393.md
@@ -0,0 +1,5 @@
+---
+"@linode/manager": Upcoming Features
+---
+
+Add IP Version (IPv4/IPv6) support to LKE-E cluster create flow ([#12594](https://github.com/linode/manager/pull/12594))
diff --git a/packages/manager/src/features/Kubernetes/CreateCluster/ClusterNetworkingPanel.tsx b/packages/manager/src/features/Kubernetes/CreateCluster/ClusterNetworkingPanel.tsx
index 232b5e30cba..24449792412 100644
--- a/packages/manager/src/features/Kubernetes/CreateCluster/ClusterNetworkingPanel.tsx
+++ b/packages/manager/src/features/Kubernetes/CreateCluster/ClusterNetworkingPanel.tsx
@@ -1,8 +1,61 @@
-import { Stack, Typography } from '@linode/ui';
+import {
+ Divider,
+ FormControlLabel,
+ Radio,
+ RadioGroup,
+ Stack,
+ Typography,
+} from '@linode/ui';
import React from 'react';
+import { Controller, useFormContext } from 'react-hook-form';
+
+import { FormLabel } from 'src/components/FormLabel';
+
+import { useIsLkeEnterpriseEnabled } from '../kubeUtils';
export const ClusterNetworkingPanel = () => {
- return (
+ const { isLkeEnterprisePhase2FeatureEnabled } = useIsLkeEnterpriseEnabled();
+
+ const { control } = useFormContext();
+
+ return isLkeEnterprisePhase2FeatureEnabled ? (
+ <>
+ } spacing={4}>
+ (
+ field.onChange(e.target.value)}
+ value={field.value ?? null}
+ >
+ IP Version
+ } label="IPv4" value="ipv4" />
+ }
+ label="IPv4 + IPv6"
+ value="ipv4-ipv6"
+ />
+
+ )}
+ />
+
+
+ ({
+ font: theme.tokens.alias.Typography.Label.Bold.S,
+ })}
+ >
+ VPC
+
+
+ Allow for private communications within and across clusters in the
+ same data center.
+
+
+ >
+ ) : (
VPC & Firewall
diff --git a/packages/manager/src/features/Kubernetes/CreateCluster/CreateCluster.tsx b/packages/manager/src/features/Kubernetes/CreateCluster/CreateCluster.tsx
index b9bc7ba15a2..b18501ce3a7 100644
--- a/packages/manager/src/features/Kubernetes/CreateCluster/CreateCluster.tsx
+++ b/packages/manager/src/features/Kubernetes/CreateCluster/CreateCluster.tsx
@@ -82,6 +82,7 @@ import type {
CreateKubeClusterPayload,
CreateNodePoolDataBeta,
KubeNodePoolResponseBeta,
+ KubernetesStackType,
KubernetesTier,
} from '@linode/api-v4/lib/kubernetes';
import type { Region } from '@linode/api-v4/lib/regions';
@@ -90,6 +91,7 @@ import type { ExtendedIP } from 'src/utilities/ipUtils';
type FormValues = {
nodePools: KubeNodePoolResponseBeta[];
+ stack_type: KubernetesStackType | null;
};
export interface NodePoolConfigDrawerHandlerParams {
@@ -141,12 +143,20 @@ export const CreateCluster = () => {
const [selectedType, setSelectedType] = React.useState();
const [selectedPoolIndex, setSelectedPoolIndex] = React.useState();
+ const {
+ isLkeEnterpriseLAFeatureEnabled,
+ isLkeEnterpriseLAFlagEnabled,
+ isLkeEnterprisePhase2FeatureEnabled,
+ } = useIsLkeEnterpriseEnabled();
+
// Use React Hook Form for node pools to make updating pools and their configs easier.
// TODO - Future: use RHF for the rest of the form and replace FormValues with CreateKubeClusterPayload.
const { control, ...form } = useForm({
defaultValues: {
nodePools: [],
+ stack_type: isLkeEnterprisePhase2FeatureEnabled ? 'ipv4' : null,
},
+ shouldUnregister: true,
});
const nodePools = useWatch({ control, name: 'nodePools' });
const { update } = useFieldArray({
@@ -227,9 +237,6 @@ export const CreateCluster = () => {
const { mutateAsync: createKubernetesClusterBeta } =
useCreateKubernetesClusterBetaMutation();
- const { isLkeEnterpriseLAFeatureEnabled, isLkeEnterpriseLAFlagEnabled } =
- useIsLkeEnterpriseEnabled();
-
const {
isLoadingVersions,
versions: versionData,
@@ -272,6 +279,8 @@ export const CreateCluster = () => {
pick(['type', 'count', 'update_strategy'])
) as CreateNodePoolDataBeta[];
+ const stackType = form.getValues('stack_type');
+
const _ipv4 = ipV4Addr
.map((ip) => {
return ip.address;
@@ -320,6 +329,10 @@ export const CreateCluster = () => {
payload = { ...payload, tier: selectedTier };
}
+ if (isLkeEnterprisePhase2FeatureEnabled && stackType) {
+ payload = { ...payload, stack_type: stackType };
+ }
+
const createClusterFn = isUsingBetaEndpoint
? createKubernetesClusterBeta
: createKubernetesCluster;
diff --git a/packages/manager/src/mocks/presets/crud/handlers/kubernetes.ts b/packages/manager/src/mocks/presets/crud/handlers/kubernetes.ts
index 1d9f0d29fa4..a88cb827be8 100644
--- a/packages/manager/src/mocks/presets/crud/handlers/kubernetes.ts
+++ b/packages/manager/src/mocks/presets/crud/handlers/kubernetes.ts
@@ -223,6 +223,7 @@ export const createKubernetesCluster = (mockState: MockState) => [
created: DateTime.now().toISO(),
updated: DateTime.now().toISO(),
tier: payload.tier,
+ stack_type: payload.stack_type,
});
const createNodePoolPromises = (payload.node_pools || []).map(