diff --git a/packages/api-v4/.changeset/pr-11811-upcoming-features-1741607872773.md b/packages/api-v4/.changeset/pr-11811-upcoming-features-1741607872773.md new file mode 100644 index 00000000000..605ab8fe6f9 --- /dev/null +++ b/packages/api-v4/.changeset/pr-11811-upcoming-features-1741607872773.md @@ -0,0 +1,5 @@ +--- +'@linode/api-v4': Upcoming Features +--- + +Add and update `/v4beta/nodebalancers` endpoints for NB-VPC Integration ([#11811](https://github.com/linode/manager/pull/11811)) diff --git a/packages/api-v4/src/nodebalancers/nodebalancer-config-nodes.ts b/packages/api-v4/src/nodebalancers/nodebalancer-config-nodes.ts index 20b9d7df86a..ccff24807b7 100644 --- a/packages/api-v4/src/nodebalancers/nodebalancer-config-nodes.ts +++ b/packages/api-v4/src/nodebalancers/nodebalancer-config-nodes.ts @@ -1,5 +1,5 @@ import { nodeBalancerConfigNodeSchema } from '@linode/validation/lib/nodebalancers.schema'; -import { API_ROOT } from '../constants'; +import { API_ROOT, BETA_API_ROOT } from '../constants'; import Request, { setData, setMethod, setURL } from '../request'; import { ResourcePage as Page } from '../types'; import { @@ -31,6 +31,28 @@ export const getNodeBalancerConfigNodes = ( ) ); +/** + * getNodeBalancerConfigNodesBeta + * + * Returns a paginated list of nodes for the specified NodeBalancer configuration profile from the beta API. + * Note: Returns the vpc_config_id in case of a VPC backend + * + * @param nodeBalancerId { number } The ID of the NodeBalancer the config belongs to. + * @param configId { number } The configuration profile to retrieve nodes for. + */ +export const getNodeBalancerConfigNodesBeta = ( + nodeBalancerId: number, + configId: number +) => + Request>( + setMethod('GET'), + setURL( + `${BETA_API_ROOT}/nodebalancers/${encodeURIComponent( + nodeBalancerId + )}/configs/${encodeURIComponent(configId)}/nodes` + ) + ); + /** * getNodeBalancerConfigNode * @@ -55,6 +77,32 @@ export const getNodeBalancerConfigNode = ( )}` ) ); +/** + * getNodeBalancerConfigNodeBeta + * + * Returns details about a specific node for the given NodeBalancer configuration profile from the beta API. + * + * Note: Returns the vpc_config_id in case of a VPC backend + * + * @param nodeBalancerId { number } The ID of the NodeBalancer the config belongs to. + * @param configId { number } The configuration profile to retrieve nodes for. + * @param nodeId { number } The Node to be retrieved. + */ +export const getNodeBalancerConfigNodeBeta = ( + nodeBalancerId: number, + configId: number, + nodeId: number +) => + Request>( + setMethod('GET'), + setURL( + `${BETA_API_ROOT}/nodebalancers/${encodeURIComponent( + nodeBalancerId + )}/configs/${encodeURIComponent(configId)}/nodes/${encodeURIComponent( + nodeId + )}` + ) + ); /** * createNodeBalancerConfigNode * @@ -95,7 +143,34 @@ export const createNodeBalancerConfigNode = ( ); /** - * createNodeBalancerConfigNode + * createNodeBalancerConfigNodeBeta + * + * Creates a NodeBalancer Node, a backend that can accept traffic for + * this NodeBalancer Config. Nodes are routed requests on the configured port based on their status. + * + * Note: The BETA version accepts a Node's VPC IP address and subnet-id + * + * @param nodeBalancerId { number } The ID of the NodeBalancer the config belongs to. + * @param configId { number } The configuration profile to add a node to. + * @param data + */ +export const createNodeBalancerConfigNodeBeta = ( + nodeBalancerId: number, + configId: number, + data: CreateNodeBalancerConfigNode +) => + Request( + setMethod('POST'), + setURL( + `${BETA_API_ROOT}/nodebalancers/${encodeURIComponent( + nodeBalancerId + )}/configs/${encodeURIComponent(configId)}/nodes` + ), + setData(data, nodeBalancerConfigNodeSchema, mergeAddressAndPort) + ); + +/** + * UpdateNodeBalancerConfigNode * * Updates a backend node for the specified NodeBalancer configuration profile. * @@ -135,6 +210,34 @@ export const updateNodeBalancerConfigNode = ( setData(data, nodeBalancerConfigNodeSchema, mergeAddressAndPort) ); +/** + * UpdateNodeBalancerConfigNodeBeta + * + * Updates a backend node for the specified NodeBalancer configuration profile. + * + * Note: The BETA version accepts a Node's VPC IP address and subnet-id + * + * @param nodeBalancerId { number } The ID of the NodeBalancer the config belongs to. + * @param configId { number } The configuration profile to add a node to. + * @param data + */ +export const updateNodeBalancerConfigNodeBeta = ( + nodeBalancerId: number, + configId: number, + nodeId: number, + data: UpdateNodeBalancerConfigNode +) => + Request( + setMethod('PUT'), + setURL( + `${BETA_API_ROOT}/nodebalancers/${encodeURIComponent( + nodeBalancerId + )}/configs/${encodeURIComponent(configId)}/nodes/${encodeURIComponent( + nodeId + )}` + ), + setData(data, nodeBalancerConfigNodeSchema, mergeAddressAndPort) + ); /** * deleteNodeBalancerConfigNode * diff --git a/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts b/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts index ac81afa6c28..a690d580c41 100644 --- a/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts +++ b/packages/api-v4/src/nodebalancers/nodebalancer-configs.ts @@ -2,7 +2,7 @@ import { createNodeBalancerConfigSchema, UpdateNodeBalancerConfigSchema, } from '@linode/validation/lib/nodebalancers.schema'; -import { API_ROOT } from '../constants'; +import { API_ROOT, BETA_API_ROOT } from '../constants'; import Request, { setData, setMethod, setParams, setURL } from '../request'; import { ResourcePage as Page, Params } from '../types'; import { @@ -75,6 +75,34 @@ export const createNodeBalancerConfig = ( ) ); +/** + * createNodeBalancerConfigBeta + * + * Creates a NodeBalancer Config, which allows the NodeBalancer to accept traffic on a new port. + * You will need to add NodeBalancer Nodes to the new Config before it can actually serve requests. + * + * Note: The BETA version accepts a Node's VPC IP address and subnet-id + * + * @param nodeBalancerId { number } The NodeBalancer to receive the new config. + */ +export const createNodeBalancerConfigBeta = ( + nodeBalancerId: number, + data: CreateNodeBalancerConfig +) => + Request( + setMethod('POST'), + setURL( + `${BETA_API_ROOT}/nodebalancers/${encodeURIComponent( + nodeBalancerId + )}/configs` + ), + setData( + data, + createNodeBalancerConfigSchema, + combineConfigNodeAddressAndPort + ) + ); + /** * updateNodeBalancerConfig * diff --git a/packages/api-v4/src/nodebalancers/nodebalancers.ts b/packages/api-v4/src/nodebalancers/nodebalancers.ts index 35f378bdea4..f9469565dd8 100644 --- a/packages/api-v4/src/nodebalancers/nodebalancers.ts +++ b/packages/api-v4/src/nodebalancers/nodebalancers.ts @@ -95,6 +95,22 @@ export const createNodeBalancer = (data: CreateNodeBalancerPayload) => ) ); +/** + * createNodeBalancerBeta + * + * Add a NodeBalancer to your account using the beta API + */ +export const createNodeBalancerBeta = (data: CreateNodeBalancerPayload) => + Request( + setMethod('POST'), + setURL(`${BETA_API_ROOT}/nodebalancers`), + setData( + data, + NodeBalancerSchema, + combineNodeBalancerConfigNodeAddressAndPort + ) + ); + /** * deleteNodeBalancer * diff --git a/packages/api-v4/src/nodebalancers/types.ts b/packages/api-v4/src/nodebalancers/types.ts index f969daa2c4c..2e782011d09 100644 --- a/packages/api-v4/src/nodebalancers/types.ts +++ b/packages/api-v4/src/nodebalancers/types.ts @@ -181,6 +181,7 @@ export interface CreateNodeBalancerConfig { cipher_suite?: 'recommended' | 'legacy' | 'none'; ssl_cert?: string; ssl_key?: string; + nodes?: CreateNodeBalancerConfigNode[]; } export type UpdateNodeBalancerConfig = CreateNodeBalancerConfig; @@ -193,6 +194,7 @@ export interface CreateNodeBalancerConfigNode { */ mode?: NodeBalancerConfigNodeMode; weight?: number; + subnet_id?: number; } export type UpdateNodeBalancerConfigNode = Partial; @@ -206,6 +208,7 @@ export interface NodeBalancerConfigNode { nodebalancer_id: number; status: 'unknown' | 'UP' | 'DOWN'; weight: number; + vpc_config_id?: number | null; } export interface NodeBalancerConfigNodeWithPort extends NodeBalancerConfigNode { @@ -232,4 +235,9 @@ export interface CreateNodeBalancerPayload { configs: CreateNodeBalancerConfig[]; firewall_id?: number; tags?: string[]; + vpc?: { + subnet_id: number; + ipv4_range: string; + ipv6_range?: string; + }[]; }