From d0ceafb115f9576cd12818f66fa3ffb11271f1d7 Mon Sep 17 00:00:00 2001 From: hrao Date: Wed, 12 Mar 2025 14:01:32 +0530 Subject: [PATCH 1/7] upcoming: [M3-9421] - Add API endpoints and types for /v4/nodebalancers --- .../src/nodebalancers/nodebalancer-configs.ts | 53 +++++++++++- .../api-v4/src/nodebalancers/nodebalancers.ts | 85 +++++++++++++++++++ packages/api-v4/src/nodebalancers/types.ts | 11 +++ .../validation/src/nodebalancers.schema.ts | 6 +- 4 files changed, 153 insertions(+), 2 deletions(-) diff --git a/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts b/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts index ac81afa6c28..a62af088b47 100644 --- a/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts +++ b/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts @@ -2,12 +2,13 @@ import { createNodeBalancerConfigSchema, UpdateNodeBalancerConfigSchema, } from '@linode/validation/lib/nodebalancers.schema'; -import { API_ROOT } from '../constants'; +import { BETA_API_ROOT, API_ROOT } from '../constants'; import Request, { setData, setMethod, setParams, setURL } from '../request'; import { ResourcePage as Page, Params } from '../types'; import { CreateNodeBalancerConfig, NodeBalancerConfig, + RebuildNodeBalancerConfig, UpdateNodeBalancerConfig, } from './types'; import { combineConfigNodeAddressAndPort } from './utils'; @@ -75,6 +76,56 @@ export const createNodeBalancerConfig = ( ) ); +/** + * rebuildNodeBalancerConfig + * + * Rebuilds a NodeBalancer Config and its Nodes that you have permission to modify. + * + * @param nodeBalancerId { number } The NodeBalancer to receive the new config. + * @param configId { number } The ID of the configuration profile to be updated + */ +export const rebuildNodeBalancerConfig = ( + nodeBalancerId: number, + configId: number, + data: RebuildNodeBalancerConfig +) => + Request( + setMethod('POST'), + setURL( + `${API_ROOT}/nodebalancers/${encodeURIComponent( + nodeBalancerId + )}/configs/${encodeURIComponent(configId)}/rebuild` + ), + setData( + data, + createNodeBalancerConfigSchema, + combineConfigNodeAddressAndPort + ) + ); + +/** + * rebuildNodeBalancerConfigBeta + * + * Rebuilds a NodeBalancer Config and its Nodes that you have permission to modify. + * + * @param nodeBalancerId { number } The NodeBalancer to receive the new config. + * @param configId { number } The ID of the configuration profile to be updated + */ +export const rebuildNodeBalancerConfigBeta = ( + nodeBalancerId: number, + configId: number, + data: RebuildNodeBalancerConfig +) => + Request( + setMethod('POST'), + setURL( + `${BETA_API_ROOT}/nodebalancers/${encodeURIComponent( + nodeBalancerId + )}/configs/${encodeURIComponent(configId)}/rebuild` + ), + setData(data, UpdateNodeBalancerConfigSchema) + ); + /** * updateNodeBalancerConfig * diff --git a/packages/api-v4/src/nodebalancers/nodebalancers.ts b/packages/api-v4/src/nodebalancers/nodebalancers.ts index 35f378bdea4..6401640adcf 100644 --- a/packages/api-v4/src/nodebalancers/nodebalancers.ts +++ b/packages/api-v4/src/nodebalancers/nodebalancers.ts @@ -15,6 +15,7 @@ import type { CreateNodeBalancerPayload, NodeBalancer, NodeBalancerStats, + NodebalancerVpcConfig, } from './types'; import { combineNodeBalancerConfigNodeAddressAndPort } from './utils'; import type { Firewall } from '../firewalls/types'; @@ -158,3 +159,87 @@ export const getNodeBalancerTypes = (params?: Params) => setMethod('GET'), setParams(params) ); + +/** + * getNodeBalancerVPCs + * + * View all VPC Config information for this NodeBalancer + * + * @param nodeBalancerId { number } The ID of the NodeBalancer to view vpc config info for. + */ +export const getNodeBalancerVPCs = ( + nodeBalancerId: number, + params?: Params, + filter?: Filter +) => + Request>( + setURL( + `${API_ROOT}/nodebalancers/${encodeURIComponent(nodeBalancerId)}/vpcs` + ), + setMethod('GET'), + setXFilter(filter), + setParams(params) + ); + +/** + * getNodeBalancerVPCsBeta + * + * View all VPC Config information for this NodeBalancer + * + * @param nodeBalancerId { number } The ID of the NodeBalancer to view vpc config info for. + */ +export const getNodeBalancerVPCsBeta = ( + nodeBalancerId: number, + params?: Params, + filter?: Filter +) => + Request>( + setURL( + `${BETA_API_ROOT}/nodebalancers/${encodeURIComponent( + nodeBalancerId + )}/vpcs` + ), + setMethod('GET'), + setXFilter(filter), + setParams(params) + ); + +/** + * getNodeBalancerVPC + * + * View VPC Config information for this NodeBalancer and VPC Config id + * + * @param nodeBalancerId { number } The ID of the NodeBalancer to view vpc config info for. + */ +export const getNodeBalancerVPC = ( + nodeBalancerId: number, + nbVpcConfigId: number +) => + Request( + setURL( + `${API_ROOT}/nodebalancers/${encodeURIComponent( + nodeBalancerId + )}/vpcs/${encodeURIComponent(nbVpcConfigId)}` + ), + setMethod('GET') + ); + +/** + * getNodeBalancerVPCBeta + * + * View VPC Config information for this NodeBalancer and VPC Config id + * + * @param nodeBalancerId { number } The ID of the NodeBalancer to view vpc config info for. + */ +export const getNodeBalancerVPCBeta = ( + nodeBalancerId: number, + nbVpcConfigId: number +) => + Request( + setURL( + `${BETA_API_ROOT}/nodebalancers/${encodeURIComponent( + nodeBalancerId + )}/vpcs/${encodeURIComponent(nbVpcConfigId)}` + ), + setMethod('GET') + ); diff --git a/packages/api-v4/src/nodebalancers/types.ts b/packages/api-v4/src/nodebalancers/types.ts index f969daa2c4c..8e433cdaaa2 100644 --- a/packages/api-v4/src/nodebalancers/types.ts +++ b/packages/api-v4/src/nodebalancers/types.ts @@ -134,6 +134,15 @@ export interface NodeBalancerStats { }; } +export interface NodebalancerVpcConfig { + id: number; + nodebalancer_id: number; + vpc_id: number; + subnet_id: number; + ipv4_range: string | null; + ipv6_range: string | null; +} + export interface CreateNodeBalancerConfig { port?: number; /** @@ -185,6 +194,8 @@ export interface CreateNodeBalancerConfig { export type UpdateNodeBalancerConfig = CreateNodeBalancerConfig; +export type RebuildNodeBalancerConfig = CreateNodeBalancerConfig; + export interface CreateNodeBalancerConfigNode { address: string; label: string; diff --git a/packages/validation/src/nodebalancers.schema.ts b/packages/validation/src/nodebalancers.schema.ts index 84a8049d614..90d5e0e0743 100644 --- a/packages/validation/src/nodebalancers.schema.ts +++ b/packages/validation/src/nodebalancers.schema.ts @@ -221,12 +221,16 @@ export const UpdateNodeBalancerConfigSchema = object({ is: 'https', then: (schema) => schema.required(), }), - udp_check_port: number().min(1).max(65535), stickiness: string().when('protocol', { is: 'udp', then: (schema) => schema.oneOf(['none', 'source_ip', 'session']), otherwise: (schema) => schema.oneOf(['none', 'table', 'http_cookie']), }), + udp_check_port: number().min(1).max(65535), + nodes: array() + .of(nodeBalancerConfigNodeSchema) + .required() + .min(1, 'You must provide at least one back end node.'), }); const client_conn_throttle = number() From ec321cb01f19ef1191a84145626b9902d1ddb65c Mon Sep 17 00:00:00 2001 From: hrao Date: Wed, 12 Mar 2025 16:43:50 +0530 Subject: [PATCH 2/7] Added changeset: Add `/v4beta/nodebalancers` and `/v4/nodebalancers` endpoints for NB-VPC Integration --- .../.changeset/pr-11832-upcoming-features-1741778030625.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/api-v4/.changeset/pr-11832-upcoming-features-1741778030625.md diff --git a/packages/api-v4/.changeset/pr-11832-upcoming-features-1741778030625.md b/packages/api-v4/.changeset/pr-11832-upcoming-features-1741778030625.md new file mode 100644 index 00000000000..d812f32f564 --- /dev/null +++ b/packages/api-v4/.changeset/pr-11832-upcoming-features-1741778030625.md @@ -0,0 +1,5 @@ +--- +"@linode/api-v4": Upcoming Features +--- + +Add `/v4beta/nodebalancers` and `/v4/nodebalancers` endpoints for NB-VPC Integration ([#11832](https://github.com/linode/manager/pull/11832)) From 60a1f40ad92fea04f25c4ba82bc0fe73d623580d Mon Sep 17 00:00:00 2001 From: hrao Date: Tue, 18 Mar 2025 14:33:59 +0530 Subject: [PATCH 3/7] removed error in configRebuild api call --- packages/api-v4/src/nodebalancers/nodebalancer-configs.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts b/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts index a62af088b47..d8367079505 100644 --- a/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts +++ b/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts @@ -123,7 +123,11 @@ export const rebuildNodeBalancerConfigBeta = ( nodeBalancerId )}/configs/${encodeURIComponent(configId)}/rebuild` ), - setData(data, UpdateNodeBalancerConfigSchema) + setData( + data, + createNodeBalancerConfigSchema, + combineConfigNodeAddressAndPort + ) ); /** From 82ae2faaf449c6b217f103905c0e6b30d808237d Mon Sep 17 00:00:00 2001 From: hrao Date: Wed, 19 Mar 2025 16:33:52 +0530 Subject: [PATCH 4/7] removed schema change --- packages/validation/src/nodebalancers.schema.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/validation/src/nodebalancers.schema.ts b/packages/validation/src/nodebalancers.schema.ts index 90d5e0e0743..84a8049d614 100644 --- a/packages/validation/src/nodebalancers.schema.ts +++ b/packages/validation/src/nodebalancers.schema.ts @@ -221,16 +221,12 @@ export const UpdateNodeBalancerConfigSchema = object({ is: 'https', then: (schema) => schema.required(), }), + udp_check_port: number().min(1).max(65535), stickiness: string().when('protocol', { is: 'udp', then: (schema) => schema.oneOf(['none', 'source_ip', 'session']), otherwise: (schema) => schema.oneOf(['none', 'table', 'http_cookie']), }), - udp_check_port: number().min(1).max(65535), - nodes: array() - .of(nodeBalancerConfigNodeSchema) - .required() - .min(1, 'You must provide at least one back end node.'), }); const client_conn_throttle = number() From aa17b4792b83bd9769a886782dc83e8333bd2c1b Mon Sep 17 00:00:00 2001 From: hrao Date: Wed, 19 Mar 2025 16:52:30 +0530 Subject: [PATCH 5/7] added beta functions in utils for accomodating subnet_id --- .../src/nodebalancers/nodebalancer-configs.ts | 9 ++-- .../api-v4/src/nodebalancers/nodebalancers.ts | 49 ++----------------- packages/api-v4/src/nodebalancers/utils.ts | 25 ++++++++++ 3 files changed, 36 insertions(+), 47 deletions(-) diff --git a/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts b/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts index fdb65803738..2a2806e0712 100644 --- a/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts +++ b/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts @@ -11,7 +11,10 @@ import { RebuildNodeBalancerConfig, UpdateNodeBalancerConfig, } from './types'; -import { combineConfigNodeAddressAndPort } from './utils'; +import { + combineConfigNodeAddressAndPort, + combineConfigNodeAddressAndPortBeta, +} from './utils'; /** * getNodeBalancerConfigs @@ -100,7 +103,7 @@ export const createNodeBalancerConfigBeta = ( setData( data, createNodeBalancerConfigSchema, - combineConfigNodeAddressAndPort + combineConfigNodeAddressAndPortBeta ) ); @@ -154,7 +157,7 @@ export const rebuildNodeBalancerConfigBeta = ( setData( data, createNodeBalancerConfigSchema, - combineConfigNodeAddressAndPort + combineConfigNodeAddressAndPortBeta ) ); diff --git a/packages/api-v4/src/nodebalancers/nodebalancers.ts b/packages/api-v4/src/nodebalancers/nodebalancers.ts index a8e67a531de..f04bf4337b5 100644 --- a/packages/api-v4/src/nodebalancers/nodebalancers.ts +++ b/packages/api-v4/src/nodebalancers/nodebalancers.ts @@ -17,7 +17,10 @@ import type { NodeBalancerStats, NodebalancerVpcConfig, } from './types'; -import { combineNodeBalancerConfigNodeAddressAndPort } from './utils'; +import { + combineNodeBalancerConfigNodeAddressAndPort, + combineNodeBalancerConfigNodeAddressAndPortBeta, +} from './utils'; import type { Firewall } from '../firewalls/types'; /** @@ -108,7 +111,7 @@ export const createNodeBalancerBeta = (data: CreateNodeBalancerPayload) => setData( data, NodeBalancerSchema, - combineNodeBalancerConfigNodeAddressAndPort + combineNodeBalancerConfigNodeAddressAndPortBeta ) ); @@ -176,27 +179,6 @@ export const getNodeBalancerTypes = (params?: Params) => setParams(params) ); -/** - * getNodeBalancerVPCs - * - * View all VPC Config information for this NodeBalancer - * - * @param nodeBalancerId { number } The ID of the NodeBalancer to view vpc config info for. - */ -export const getNodeBalancerVPCs = ( - nodeBalancerId: number, - params?: Params, - filter?: Filter -) => - Request>( - setURL( - `${API_ROOT}/nodebalancers/${encodeURIComponent(nodeBalancerId)}/vpcs` - ), - setMethod('GET'), - setXFilter(filter), - setParams(params) - ); - /** * getNodeBalancerVPCsBeta * @@ -219,27 +201,6 @@ export const getNodeBalancerVPCsBeta = ( setXFilter(filter), setParams(params) ); - -/** - * getNodeBalancerVPC - * - * View VPC Config information for this NodeBalancer and VPC Config id - * - * @param nodeBalancerId { number } The ID of the NodeBalancer to view vpc config info for. - */ -export const getNodeBalancerVPC = ( - nodeBalancerId: number, - nbVpcConfigId: number -) => - Request( - setURL( - `${API_ROOT}/nodebalancers/${encodeURIComponent( - nodeBalancerId - )}/vpcs/${encodeURIComponent(nbVpcConfigId)}` - ), - setMethod('GET') - ); - /** * getNodeBalancerVPCBeta * diff --git a/packages/api-v4/src/nodebalancers/utils.ts b/packages/api-v4/src/nodebalancers/utils.ts index 42f81e54700..17d4fdab160 100644 --- a/packages/api-v4/src/nodebalancers/utils.ts +++ b/packages/api-v4/src/nodebalancers/utils.ts @@ -10,6 +10,17 @@ export const combineConfigNodeAddressAndPort = (data: any) => ({ })), }); +export const combineConfigNodeAddressAndPortBeta = (data: any) => ({ + ...data, + nodes: data.nodes.map((n: any) => ({ + address: `${n.address}:${n.port}`, + label: n.label, + mode: n.mode, + weight: n.weight, + subnet_id: n.subnet_id, + })), +}); + export const combineNodeBalancerConfigNodeAddressAndPort = (data: any) => ({ ...data, configs: data.configs.map((c: any) => ({ @@ -23,6 +34,20 @@ export const combineNodeBalancerConfigNodeAddressAndPort = (data: any) => ({ })), }); +export const combineNodeBalancerConfigNodeAddressAndPortBeta = (data: any) => ({ + ...data, + configs: data.configs.map((c: any) => ({ + ...c, + nodes: c.nodes.map((n: any) => ({ + address: `${n.address}:${n.port}`, + label: n.label, + mode: n.mode, + weight: n.weight, + subnet_id: n.subnet_id, + })), + })), +}); + export const mergeAddressAndPort = (node: NodeBalancerConfigNodeWithPort) => ({ ...node, address: `${node.address}:${node.port}`, From 9f693f7082bc8bc5648e7ca6091a0842fb1c7e94 Mon Sep 17 00:00:00 2001 From: hrao Date: Thu, 20 Mar 2025 11:43:12 +0530 Subject: [PATCH 6/7] corrected createNodeBalancerPayload types to match APISpec --- packages/api-v4/src/nodebalancers/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api-v4/src/nodebalancers/types.ts b/packages/api-v4/src/nodebalancers/types.ts index 98912be5d3f..0ce208c81fa 100644 --- a/packages/api-v4/src/nodebalancers/types.ts +++ b/packages/api-v4/src/nodebalancers/types.ts @@ -246,7 +246,7 @@ export interface CreateNodeBalancerPayload { configs: CreateNodeBalancerConfig[]; firewall_id?: number; tags?: string[]; - vpc?: { + vpcs?: { subnet_id: number; ipv4_range: string; ipv6_range?: string; From 2133f26884ddd04795a2e8811303383edabeb08b Mon Sep 17 00:00:00 2001 From: hrao Date: Mon, 24 Mar 2025 18:39:46 +0530 Subject: [PATCH 7/7] function name change --- packages/api-v4/src/nodebalancers/nodebalancers.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/api-v4/src/nodebalancers/nodebalancers.ts b/packages/api-v4/src/nodebalancers/nodebalancers.ts index f04bf4337b5..8560eafe0eb 100644 --- a/packages/api-v4/src/nodebalancers/nodebalancers.ts +++ b/packages/api-v4/src/nodebalancers/nodebalancers.ts @@ -180,13 +180,13 @@ export const getNodeBalancerTypes = (params?: Params) => ); /** - * getNodeBalancerVPCsBeta + * getNodeBalancerVPCConfigsBeta * * View all VPC Config information for this NodeBalancer * * @param nodeBalancerId { number } The ID of the NodeBalancer to view vpc config info for. */ -export const getNodeBalancerVPCsBeta = ( +export const getNodeBalancerVPCConfigsBeta = ( nodeBalancerId: number, params?: Params, filter?: Filter @@ -202,13 +202,13 @@ export const getNodeBalancerVPCsBeta = ( setParams(params) ); /** - * getNodeBalancerVPCBeta + * getNodeBalancerVPCConfigBeta * * View VPC Config information for this NodeBalancer and VPC Config id * * @param nodeBalancerId { number } The ID of the NodeBalancer to view vpc config info for. */ -export const getNodeBalancerVPCBeta = ( +export const getNodeBalancerVPCConfigBeta = ( nodeBalancerId: number, nbVpcConfigId: number ) =>