Skip to content

Commit 3ca4f1d

Browse files
authored
upcoming: [M3-8881, M3-8885] - Add and update beta endpoints and queries for LKE-E (#11302)
* Update types for LKE-E * Update apiv4 endpoints for LKE-E * Update queries to use LKE-E beta endpoints * Add changesets * Address feedback: fix missing tier param in path * Add 'Beta' to endpoint name for consistency * Address feedback: use string for beta query key instead of boolean
1 parent a52c2ba commit 3ca4f1d

File tree

5 files changed

+136
-17
lines changed

5 files changed

+136
-17
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@linode/api-v4": Upcoming Features
3+
---
4+
5+
Add new types and v4beta endpoints for LKE-E ([#11302](https://github.com/linode/manager/pull/11302))

packages/api-v4/src/kubernetes/kubernetes.ts

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import type {
1616
KubernetesDashboardResponse,
1717
KubernetesVersion,
1818
KubernetesControlPlaneACLPayload,
19+
KubernetesTieredVersion,
1920
} from './types';
2021

2122
/**
@@ -31,6 +32,19 @@ export const getKubernetesClusters = (params?: Params, filters?: Filter) =>
3132
setURL(`${API_ROOT}/lke/clusters`)
3233
);
3334

35+
/**
36+
* getKubernetesClustersBeta
37+
*
38+
* Gets a list of a user's Kubernetes clusters from beta API
39+
*/
40+
export const getKubernetesClustersBeta = (params?: Params, filters?: Filter) =>
41+
Request<Page<KubernetesCluster>>(
42+
setMethod('GET'),
43+
setParams(params),
44+
setXFilter(filters),
45+
setURL(`${BETA_API_ROOT}/lke/clusters`)
46+
);
47+
3448
/**
3549
* getKubernetesCluster
3650
*
@@ -69,11 +83,12 @@ export const createKubernetesCluster = (data: CreateKubeClusterPayload) => {
6983
/**
7084
* createKubernetesClustersBeta
7185
*
72-
* Create a new cluster with the BETA api whenever feature flag for APL is enabled
73-
* and APL is set to enabled in the UI
86+
* Create a new cluster with the beta API:
87+
* 1. When the feature flag for APL is enabled and APL is set to enabled in the UI
88+
* 2. When the LKE-E feature is enabled
7489
*
7590
* duplicated function of createKubernetesCluster
76-
* necessary to call BETA_API_ROOT in a seperate function based on feature flag
91+
* necessary to call BETA_API_ROOT in a separate function based on feature flag
7792
*/
7893
export const createKubernetesClusterBeta = (data: CreateKubeClusterPayload) => {
7994
return Request<KubernetesCluster>(
@@ -154,6 +169,24 @@ export const getKubernetesVersions = (params?: Params, filters?: Filter) =>
154169
setURL(`${API_ROOT}/lke/versions`)
155170
);
156171

172+
/** getKubernetesTieredVersionsBeta
173+
*
174+
* Returns a paginated list of available Kubernetes tiered versions from the beta API.
175+
*
176+
*/
177+
178+
export const getKubernetesTieredVersionsBeta = (
179+
tier: string,
180+
params?: Params,
181+
filters?: Filter
182+
) =>
183+
Request<Page<KubernetesTieredVersion>>(
184+
setMethod('GET'),
185+
setXFilter(filters),
186+
setParams(params),
187+
setURL(`${BETA_API_ROOT}/lke/versions/${encodeURIComponent(tier)}`)
188+
);
189+
157190
/** getKubernetesVersion
158191
*
159192
* Returns a single Kubernetes version by ID.
@@ -166,6 +199,25 @@ export const getKubernetesVersion = (versionID: string) =>
166199
setURL(`${API_ROOT}/lke/versions/${encodeURIComponent(versionID)}`)
167200
);
168201

202+
/** getKubernetesTieredVersionBeta
203+
*
204+
* Returns a single tiered Kubernetes version by ID from the beta API.
205+
*
206+
*/
207+
208+
export const getKubernetesTieredVersionBeta = (
209+
tier: string,
210+
versionID: string
211+
) =>
212+
Request<KubernetesTieredVersion>(
213+
setMethod('GET'),
214+
setURL(
215+
`${BETA_API_ROOT}/lke/versions/${encodeURIComponent(
216+
tier
217+
)}/${encodeURIComponent(versionID)}`
218+
)
219+
);
220+
169221
/** getKubernetesClusterEndpoint
170222
*
171223
* Returns the endpoint URL for a single Kubernetes cluster by ID.

packages/api-v4/src/kubernetes/types.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import type { EncryptionStatus } from '../linodes';
22

3+
export type KubernetesTier = 'standard' | 'enterprise';
4+
35
export interface KubernetesCluster {
46
created: string;
57
updated: string;
@@ -11,6 +13,10 @@ export interface KubernetesCluster {
1113
tags: string[];
1214
control_plane: ControlPlaneOptions;
1315
apl_enabled?: boolean; // this is not the ideal solution, but a necessary compromise to prevent a lot of duplicated code.
16+
/** Marked as 'optional' in this existing interface to prevent duplicated code for beta functionality, in line with the apl_enabled approach.
17+
* @todo LKE-E - Make this field required once LKE-E is in GA. tier defaults to 'standard' in the API.
18+
*/
19+
tier?: KubernetesTier;
1420
}
1521

1622
export interface KubeNodePoolResponse {
@@ -52,6 +58,11 @@ export interface KubernetesVersion {
5258
id: string;
5359
}
5460

61+
export interface KubernetesTieredVersion {
62+
id: string;
63+
tier: KubernetesTier;
64+
}
65+
5566
export interface KubernetesEndpointResponse {
5667
endpoint: string;
5768
}
@@ -85,4 +96,5 @@ export interface CreateKubeClusterPayload {
8596
k8s_version?: string; // Will be caught by Yup if undefined
8697
control_plane?: ControlPlaneOptions;
8798
apl_enabled?: boolean; // this is not the ideal solution, but a necessary compromise to prevent a lot of duplicated code.
99+
tier?: KubernetesTier; // For LKE-E: Will be assigned 'standard' by the API if not provided
88100
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@linode/manager": Upcoming Features
3+
---
4+
5+
Add and update kubernetes queries for LKE-E beta endpoints ([#11302](https://github.com/linode/manager/pull/11302))

packages/manager/src/queries/kubernetes.ts

Lines changed: 59 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import {
1111
getKubernetesClusterDashboard,
1212
getKubernetesClusterEndpoints,
1313
getKubernetesClusters,
14+
getKubernetesClustersBeta,
15+
getKubernetesTieredVersionsBeta,
1416
getKubernetesTypes,
1517
getKubernetesVersions,
1618
getNodePools,
@@ -30,7 +32,10 @@ import {
3032
useQueryClient,
3133
} from '@tanstack/react-query';
3234

33-
import { useAPLAvailability } from 'src/features/Kubernetes/kubeUtils';
35+
import {
36+
useAPLAvailability,
37+
useIsLkeEnterpriseEnabled,
38+
} from 'src/features/Kubernetes/kubeUtils';
3439
import { getAll } from 'src/utilities/getAll';
3540

3641
import { queryPresets } from './base';
@@ -44,6 +49,7 @@ import type {
4449
KubernetesControlPlaneACLPayload,
4550
KubernetesDashboardResponse,
4651
KubernetesEndpointResponse,
52+
KubernetesTieredVersion,
4753
KubernetesVersion,
4854
UpdateNodePoolData,
4955
} from '@linode/api-v4';
@@ -66,7 +72,7 @@ export const kubernetesQueries = createQueryKeys('kubernetes', {
6672
queryFn: useBetaEndpoint
6773
? () => getKubernetesClusterBeta(id)
6874
: () => getKubernetesCluster(id),
69-
queryKey: [useBetaEndpoint],
75+
queryKey: [useBetaEndpoint ? 'v4beta' : 'v4'],
7076
}),
7177
dashboard: {
7278
queryFn: () => getKubernetesClusterDashboard(id),
@@ -93,17 +99,31 @@ export const kubernetesQueries = createQueryKeys('kubernetes', {
9399
}),
94100
lists: {
95101
contextQueries: {
96-
all: {
97-
queryFn: () => getAllKubernetesClusters(),
98-
queryKey: null,
99-
},
100-
paginated: (params: Params, filter: Filter) => ({
101-
queryFn: () => getKubernetesClusters(params, filter),
102-
queryKey: [params, filter],
102+
all: (useBetaEndpoint: boolean = false) => ({
103+
queryFn: () =>
104+
useBetaEndpoint
105+
? getAllKubernetesClustersBeta()
106+
: getAllKubernetesClusters(),
107+
queryKey: [useBetaEndpoint ? 'v4beta' : 'v4'],
108+
}),
109+
paginated: (
110+
params: Params,
111+
filter: Filter,
112+
useBetaEndpoint: boolean = false
113+
) => ({
114+
queryFn: () =>
115+
useBetaEndpoint
116+
? getKubernetesClustersBeta()
117+
: getKubernetesClusters(params, filter),
118+
queryKey: [params, filter, useBetaEndpoint ? 'v4beta' : 'v4'],
103119
}),
104120
},
105121
queryKey: null,
106122
},
123+
tieredVersions: (tier: string) => ({
124+
queryFn: () => getAllKubernetesTieredVersionsBeta(tier),
125+
queryKey: [tier],
126+
}),
107127
types: {
108128
queryFn: () => getAllKubernetesTypes(),
109129
queryKey: null,
@@ -116,9 +136,11 @@ export const kubernetesQueries = createQueryKeys('kubernetes', {
116136

117137
export const useKubernetesClusterQuery = (id: number) => {
118138
const { isLoading: isAPLAvailabilityLoading, showAPL } = useAPLAvailability();
139+
const { isLkeEnterpriseLAEnabled } = useIsLkeEnterpriseEnabled();
140+
const useBetaEndpoint = showAPL || isLkeEnterpriseLAEnabled;
119141

120142
return useQuery<KubernetesCluster, APIError[]>({
121-
...kubernetesQueries.cluster(id)._ctx.cluster(showAPL),
143+
...kubernetesQueries.cluster(id)._ctx.cluster(useBetaEndpoint),
122144
enabled: !isAPLAvailabilityLoading,
123145
});
124146
};
@@ -128,8 +150,11 @@ export const useKubernetesClustersQuery = (
128150
filter: Filter,
129151
enabled = true
130152
) => {
153+
const { isLkeEnterpriseLAEnabled } = useIsLkeEnterpriseEnabled();
154+
const useBetaEndpoint = isLkeEnterpriseLAEnabled;
155+
131156
return useQuery<ResourcePage<KubernetesCluster>, APIError[]>({
132-
...kubernetesQueries.lists._ctx.paginated(params, filter),
157+
...kubernetesQueries.lists._ctx.paginated(params, filter, useBetaEndpoint),
133158
enabled,
134159
placeholderData: keepPreviousData,
135160
});
@@ -228,7 +253,7 @@ export const useCreateKubernetesClusterMutation = () => {
228253

229254
/**
230255
* duplicated function of useCreateKubernetesClusterMutation
231-
* necessary to call BETA_API_ROOT in a seperate function based on feature flag
256+
* necessary to call BETA_API_ROOT in a separate function based on feature flag
232257
*/
233258

234259
export const useCreateKubernetesClusterBetaMutation = () => {
@@ -354,13 +379,23 @@ export const useKubernetesVersionQuery = () =>
354379
...queryPresets.oneTimeFetch,
355380
});
356381

382+
export const useKubernetesTieredVersionQuery = (tier: string) => {
383+
useQuery<KubernetesTieredVersion[], APIError[]>({
384+
...kubernetesQueries.tieredVersions(tier),
385+
...queryPresets.oneTimeFetch,
386+
});
387+
};
388+
357389
/**
358390
* Avoiding fetching all Kubernetes Clusters if possible.
359-
* Before you use this, consider implementing infinite scroll insted.
391+
* Before you use this, consider implementing infinite scroll instead.
360392
*/
361393
export const useAllKubernetesClustersQuery = (enabled = false) => {
394+
const { isLkeEnterpriseLAEnabled } = useIsLkeEnterpriseEnabled();
395+
const useBetaEndpoint = isLkeEnterpriseLAEnabled;
396+
362397
return useQuery<KubernetesCluster[], APIError[]>({
363-
...kubernetesQueries.lists._ctx.all,
398+
...kubernetesQueries.lists._ctx.all(useBetaEndpoint),
364399
enabled,
365400
});
366401
};
@@ -403,11 +438,21 @@ const getAllKubernetesClusters = () =>
403438
getKubernetesClusters(params, filters)
404439
)().then((data) => data.data);
405440

441+
const getAllKubernetesClustersBeta = () =>
442+
getAll<KubernetesCluster>((params, filters) =>
443+
getKubernetesClustersBeta(params, filters)
444+
)().then((data) => data.data);
445+
406446
const getAllKubernetesVersions = () =>
407447
getAll<KubernetesVersion>((params, filters) =>
408448
getKubernetesVersions(params, filters)
409449
)().then((data) => data.data);
410450

451+
const getAllKubernetesTieredVersionsBeta = (tier: string) =>
452+
getAll<KubernetesTieredVersion>((params, filters) =>
453+
getKubernetesTieredVersionsBeta(tier, params, filters)
454+
)().then((data) => data.data);
455+
411456
const getAllAPIEndpointsForCluster = (clusterId: number) =>
412457
getAll<KubernetesEndpointResponse>((params, filters) =>
413458
getKubernetesClusterEndpoints(clusterId, params, filters)

0 commit comments

Comments
 (0)