From 6f050b29eb68f87635589c7823cf46af40a9f222 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Mon, 17 Mar 2025 14:23:23 -0400 Subject: [PATCH 1/4] update types and validation for VPC entity --- packages/api-v4/src/vpcs/types.ts | 11 +++++++++++ packages/validation/src/vpcs.schema.ts | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/packages/api-v4/src/vpcs/types.ts b/packages/api-v4/src/vpcs/types.ts index cf15d1112dd..025fbe5fd46 100644 --- a/packages/api-v4/src/vpcs/types.ts +++ b/packages/api-v4/src/vpcs/types.ts @@ -1,3 +1,12 @@ +interface VPCIPv6 { + range?: string[]; +} + +interface CreateVPCIPV6 extends VPCIPv6 { + // Omitted from VPC response, only permitted in requests + allocation_class?: string[] +} + export interface VPC { id: number; label: string; @@ -6,12 +15,14 @@ export interface VPC { subnets: Subnet[]; created: string; updated: string; + ipv6?: VPCIPv6[]; } export interface CreateVPCPayload { label: string; description?: string; region: string; + ipv6?: CreateVPCIPV6[]; subnets?: CreateSubnetPayload[]; } diff --git a/packages/validation/src/vpcs.schema.ts b/packages/validation/src/vpcs.schema.ts index 1196436186c..1aa8bf7d203 100644 --- a/packages/validation/src/vpcs.schema.ts +++ b/packages/validation/src/vpcs.schema.ts @@ -94,6 +94,10 @@ export const vpcsValidateIP = ({ } if (isIPv6) { + // VPCs must be assigned an IPv6 prefix of /52, /48, or /44 + if (!['52', '48', '44'].includes(mask)) { + return false; + } if (shouldHaveIPMask) { ipaddr.IPv6.parseCIDR(value); } else { @@ -210,11 +214,29 @@ export const createSubnetSchema = object().shape( ] ); +const createVPCIPv6Schema = object().shape({ + range: array().of(string().test({ + name: 'IPv6 prefix length', + message: 'Must be the prefix length 52, 48, or 44 of the IP, e.g. /52', + test: (value) => { + if (value && value !== 'auto' && value.length > 0) { + vpcsValidateIP({ + value, + shouldHaveIPMask: true, + mustBeIPMask: false, + }) + } + } + })), + allocation_class: array().of(string()).optional() +}) + export const createVPCSchema = object({ label: labelValidation.required(LABEL_REQUIRED), description: string(), region: string().required('Region is required'), subnets: array().of(createSubnetSchema), + ipv6: array().of(createVPCIPv6Schema).length(1).notRequired() }); export const modifySubnetSchema = object({ From 9121a703e59f8169cdabd9b695838c445d75cb1d Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Wed, 19 Mar 2025 11:39:51 -0400 Subject: [PATCH 2/4] fix types --- packages/api-v4/src/vpcs/types.ts | 5 ++-- packages/validation/src/vpcs.schema.ts | 36 ++++++++++++++------------ 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/packages/api-v4/src/vpcs/types.ts b/packages/api-v4/src/vpcs/types.ts index 025fbe5fd46..28ce606fdc8 100644 --- a/packages/api-v4/src/vpcs/types.ts +++ b/packages/api-v4/src/vpcs/types.ts @@ -1,10 +1,9 @@ interface VPCIPv6 { - range?: string[]; + range?: string; } interface CreateVPCIPV6 extends VPCIPv6 { - // Omitted from VPC response, only permitted in requests - allocation_class?: string[] + allocation_class?: string; } export interface VPC { diff --git a/packages/validation/src/vpcs.schema.ts b/packages/validation/src/vpcs.schema.ts index 1aa8bf7d203..076eaa8ca81 100644 --- a/packages/validation/src/vpcs.schema.ts +++ b/packages/validation/src/vpcs.schema.ts @@ -214,29 +214,31 @@ export const createSubnetSchema = object().shape( ] ); -const createVPCIPv6Schema = object().shape({ - range: array().of(string().test({ - name: 'IPv6 prefix length', - message: 'Must be the prefix length 52, 48, or 44 of the IP, e.g. /52', - test: (value) => { - if (value && value !== 'auto' && value.length > 0) { - vpcsValidateIP({ - value, - shouldHaveIPMask: true, - mustBeIPMask: false, - }) - } - } - })), - allocation_class: array().of(string()).optional() -}) +const createVPCIPv6Schema = object({ + range: string() + .optional() + .test({ + name: 'IPv6 prefix length', + message: 'Must be the prefix length 52, 48, or 44 of the IP, e.g. /52', + test: (value) => { + if (value && value !== 'auto' && value.length > 0) { + vpcsValidateIP({ + value, + shouldHaveIPMask: true, + mustBeIPMask: false, + }); + } + }, + }), + allocation_class: string().optional(), +}); export const createVPCSchema = object({ label: labelValidation.required(LABEL_REQUIRED), description: string(), region: string().required('Region is required'), subnets: array().of(createSubnetSchema), - ipv6: array().of(createVPCIPv6Schema).length(1).notRequired() + ipv6: array().of(createVPCIPv6Schema).max(1).optional(), }); export const modifySubnetSchema = object({ From 205fb78166178f1acd5bbb871d937431b0e2fdff Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Wed, 19 Mar 2025 16:03:54 -0400 Subject: [PATCH 3/4] Added changeset: Added optional ipv6 property to VPC entity --- .../.changeset/pr-11852-upcoming-features-1742414634244.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/api-v4/.changeset/pr-11852-upcoming-features-1742414634244.md diff --git a/packages/api-v4/.changeset/pr-11852-upcoming-features-1742414634244.md b/packages/api-v4/.changeset/pr-11852-upcoming-features-1742414634244.md new file mode 100644 index 00000000000..356dab73d57 --- /dev/null +++ b/packages/api-v4/.changeset/pr-11852-upcoming-features-1742414634244.md @@ -0,0 +1,5 @@ +--- +"@linode/api-v4": Upcoming Features +--- + +Added optional ipv6 property to VPC entity ([#11852](https://github.com/linode/manager/pull/11852)) From 3013d55130c7f30cb424831df871c8af2f8975fe Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Wed, 19 Mar 2025 16:05:38 -0400 Subject: [PATCH 4/4] Added changeset: Added optional ipv6 to `createVPCIPv6Schema` --- .../.changeset/pr-11852-upcoming-features-1742414737915.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/validation/.changeset/pr-11852-upcoming-features-1742414737915.md diff --git a/packages/validation/.changeset/pr-11852-upcoming-features-1742414737915.md b/packages/validation/.changeset/pr-11852-upcoming-features-1742414737915.md new file mode 100644 index 00000000000..65066688c58 --- /dev/null +++ b/packages/validation/.changeset/pr-11852-upcoming-features-1742414737915.md @@ -0,0 +1,5 @@ +--- +"@linode/validation": Upcoming Features +--- + +Added optional ipv6 to `createVPCIPv6Schema` ([#11852](https://github.com/linode/manager/pull/11852))