Skip to content

Commit

Permalink
feat: [M3-6779] - AGLB api-v4 endpoints (#9363)
Browse files Browse the repository at this point in the history
Adds initial api-v4 endpoints and types for the AGLB

---------

Co-authored-by: Banks Nussman <banks@nussman.us>
  • Loading branch information
bnussman-akamai and bnussman authored Jul 6, 2023
1 parent 57cb8fa commit 8ed5279
Show file tree
Hide file tree
Showing 6 changed files with 358 additions and 0 deletions.
5 changes: 5 additions & 0 deletions packages/api-v4/.changeset/pr-9363-added-1688564871453.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/api-v4": Added
---

Endpoints for the Akamai Global Load Balancer ([#9363](https://github.com/linode/manager/pull/9363))
68 changes: 68 additions & 0 deletions packages/api-v4/src/aglb/entrypoints.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import Request, { setData, setMethod, setURL } from '../request';
import { ResourcePage } from 'src/types';
import { BETA_API_ROOT } from 'src/constants';
import type {
CreateEntrypointPayload,
Entrypoint,
EntrypointPayload,
} from './types';

/**
* getEntrypoints
*
* Returns a paginated list of Akamai Global Load Balancer entry points
*/
export const getEntrypoints = () =>
Request<ResourcePage<Entrypoint>>(
setURL(`${BETA_API_ROOT}/aglb/entrypoints`),
setMethod('GET')
);

/**
* getEntrypoint
*
* Returns an Akamai Global Load Balancer entry point
*/
export const getEntrypoint = (id: number) =>
Request<Entrypoint>(
setURL(`${BETA_API_ROOT}/aglb/entrypoints/${encodeURIComponent(id)}`),
setMethod('GET')
);

/**
* createEntrypoint
*
* Creates an Akamai Global Load Balancer entry point
*/
export const createEntrypoint = (data: CreateEntrypointPayload) =>
Request<Entrypoint>(
setURL(`${BETA_API_ROOT}/aglb/entrypoints`),
setData(data),
setMethod('POST')
);

/**
* updateEntrypoint
*
* Updates an Akamai Global Load Balancer entry point
*/
export const updateEntrypoint = (
id: number,
data: Partial<EntrypointPayload>
) =>
Request<Entrypoint>(
setURL(`${BETA_API_ROOT}/aglb/entrypoints/${encodeURIComponent(id)}`),
setData(data),
setMethod('POST')
);

/**
* deleteEntrypoint
*
* Deletes an Akamai Global Load Balancer entry point
*/
export const deleteEntrypoint = (id: number) =>
Request<{}>(
setURL(`${BETA_API_ROOT}/aglb/entrypoints/${encodeURIComponent(id)}`),
setMethod('DELETE')
);
68 changes: 68 additions & 0 deletions packages/api-v4/src/aglb/loadbalancers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import Request, { setData, setMethod, setURL } from '../request';
import { BETA_API_ROOT } from 'src/constants';
import { ResourcePage } from 'src/types';
import type {
CreateLoadbalancerPayload,
Loadbalancer,
UpdateLoadbalancerPayload,
} from './types';

/**
* getLoadbalancers
*
* Returns a paginated list of Akamai Global Load Balancers
*/
export const getLoadbalancers = () =>
Request<ResourcePage<Loadbalancer>>(
setURL(`${BETA_API_ROOT}/aglb/loadbalancers`),
setMethod('GET')
);

/**
* getLoadbalancer
*
* Returns an Akamai Global Load Balancer
*/
export const getLoadbalancer = (id: number) =>
Request<Loadbalancer>(
setURL(`${BETA_API_ROOT}/aglb/loadbalancers/${encodeURIComponent(id)}`),
setMethod('GET')
);

/**
* createLoadbalancer
*
* Creates an Akamai Global Load Balancer
*/
export const createLoadbalancer = (data: CreateLoadbalancerPayload) =>
Request<Loadbalancer>(
setURL(`${BETA_API_ROOT}/aglb/loadbalancers`),
setData(data),
setMethod('POST')
);

/**
* updateLoadbalancer
*
* Updates an Akamai Global Load Balancer
*/
export const updateLoadbalancer = (
id: number,
data: UpdateLoadbalancerPayload
) =>
Request<Loadbalancer>(
setURL(`${BETA_API_ROOT}/aglb/loadbalancers/${encodeURIComponent(id)}`),
setData(data),
setMethod('POST')
);

/**
* deleteLoadbalancer
*
* Deletes an Akamai Global Load Balancer
*/
export const deleteLoadbalancer = (id: number) =>
Request<{}>(
setURL(`${BETA_API_ROOT}/aglb/loadbalancers/${encodeURIComponent(id)}`),
setMethod('DELETE')
);
61 changes: 61 additions & 0 deletions packages/api-v4/src/aglb/routes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import Request, { setData, setMethod, setURL } from '../request';
import { ResourcePage } from 'src/types';
import { BETA_API_ROOT } from 'src/constants';
import type { Route, RoutePayload } from './types';

/**
* getRoutes
*
* Returns a paginated list of Akamai Global Load Balancer routes
*/
export const getRoutes = () =>
Request<ResourcePage<Route>>(
setURL(`${BETA_API_ROOT}/aglb/routes`),
setMethod('GET')
);

/**
* getRoute
*
* Returns an Akamai Global Load Balancer route
*/
export const getRoute = (id: number) =>
Request<Route>(
setURL(`${BETA_API_ROOT}/aglb/routes/${encodeURIComponent(id)}`),
setMethod('GET')
);

/**
* createRoute
*
* Creates an Akamai Global Load Balancer route
*/
export const createRoute = (data: RoutePayload) =>
Request<Route>(
setURL(`${BETA_API_ROOT}/aglb/routes`),
setData(data),
setMethod('POST')
);

/**
* updateRoute
*
* Updates an Akamai Global Load Balancer route
*/
export const updateRoute = (id: number, data: Partial<RoutePayload>) =>
Request<Route>(
setURL(`${BETA_API_ROOT}/aglb/routes/${encodeURIComponent(id)}`),
setData(data),
setMethod('POST')
);

/**
* deleteRoute
*
* Deletes an Akamai Global Load Balancer route
*/
export const deleteRoute = (id: number) =>
Request<{}>(
setURL(`${BETA_API_ROOT}/aglb/routes/${encodeURIComponent(id)}`),
setMethod('DELETE')
);
64 changes: 64 additions & 0 deletions packages/api-v4/src/aglb/service-targets.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import Request, { setData, setMethod, setURL } from '../request';
import { ResourcePage } from 'src/types';
import { BETA_API_ROOT } from 'src/constants';
import type { ServiceTarget, ServiceTargetPayload } from './types';

/**
* getServiceTargets
*
* Returns a paginated list of Akamai Global Load Balancer service targets
*/
export const getServiceTargets = () =>
Request<ResourcePage<ServiceTarget>>(
setURL(`${BETA_API_ROOT}/aglb/service-targets`),
setMethod('GET')
);

/**
* getServiceTarget
*
* Returns an Akamai Global Load Balancer route
*/
export const getServiceTarget = (id: number) =>
Request<ServiceTarget>(
setURL(`${BETA_API_ROOT}/aglb/service-targets/${encodeURIComponent(id)}`),
setMethod('GET')
);

/**
* createServiceTarget
*
* Creates an Akamai Global Load Balancer route
*/
export const createServiceTarget = (data: ServiceTargetPayload) =>
Request<ServiceTarget>(
setURL(`${BETA_API_ROOT}/aglb/service-targets`),
setData(data),
setMethod('POST')
);

/**
* updateServiceTarget
*
* Updates an Akamai Global Load Balancer route
*/
export const updateServiceTarget = (
id: number,
data: Partial<ServiceTargetPayload>
) =>
Request<ServiceTarget>(
setURL(`${BETA_API_ROOT}/aglb/service-targets/${encodeURIComponent(id)}`),
setData(data),
setMethod('POST')
);

/**
* deleteServiceTarget
*
* Deletes an Akamai Global Load Balancer service target
*/
export const deleteServiceTarget = (id: number) =>
Request<{}>(
setURL(`${BETA_API_ROOT}/aglb/service-targets/${encodeURIComponent(id)}`),
setMethod('DELETE')
);
92 changes: 92 additions & 0 deletions packages/api-v4/src/aglb/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
export interface Loadbalancer {
id: number;
tags: string[];
label: string;
regions: string[];
entrypoints: string[];
}

interface LoadbalancerPayload {
label: string;
regions: string[];
tags?: string[];
}

export interface CreateLoadbalancerPayload extends LoadbalancerPayload {
entrypoints?: EntrypointPayload[];
}

export interface UpdateLoadbalancerPayload extends LoadbalancerPayload {
entrypoints: number[];
}

type Protocol = 'TCP' | 'HTTP' | 'HTTPS';

type Policy = 'ROUND_ROBIN';

export interface RoutePayload {
label: string;
rules: Rule[];
}

export interface Route extends RoutePayload {
id: number;
}

export interface EntrypointPayload {
label: string;
port: number;
protocol: Protocol;
certificate_table: CertificateTable[];
routes: RoutePayload[];
}

export type CreateEntrypointPayload = Omit<EntrypointPayload, 'routes'>;

export interface Entrypoint {
id: number;
label: string;
port: number;
protocol: Protocol;
certificate_table: CertificateTable[];
routes: string[];
}

export interface CertificateTable {
sni_hostname: string;
certificate_id: string;
}

export interface Rule {
match_condition: Match;
service_targets: ServiceTargetPayload[];
default_target: ServiceTargetPayload;
}

export interface Match {
path: string;
}

export interface ServiceTargetPayload {
label: string;
endpoints: Endpoint[];
ca_certificate: string;
load_balancing_policy: Policy;
health_check_interval: number;
health_check_timeout: number;
health_check_unhealthy_thresh: number;
health_check_healthy_thresh: number;
health_check_path: string;
health_check_host: string;
}

export interface ServiceTarget extends ServiceTargetPayload {
id: number;
}

export interface Endpoint {
ip: string;
port: number;
capacity: number;
hard_rate_limit: number;
}

0 comments on commit 8ed5279

Please sign in to comment.