Skip to content

Commit f6e9f82

Browse files
authored
Merge pull request #5799 from bcgov/chore/5692-1
chore(5692): optimize codebase
2 parents 6d62203 + 190064f commit f6e9f82

File tree

7 files changed

+68
-54
lines changed

7 files changed

+68
-54
lines changed

app/app/api/token-check/route.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import { NextResponse } from 'next/server';
21
import createApiHandler from '@/core/api-handler';
2+
import { OkResponse } from '@/core/responses';
33
import { validateChesServiceAccountCredentials } from './validations/ches-service-account-credentials';
44
import { validateKeycloakServiceAccount } from './validations/keycloak-service-account-credentials';
55
import { validateKeycloakUserLogin } from './validations/keycloak-user-login-credentials';
66
import { validateKubernetisDeletionCheckTokens } from './validations/kubernetis-deletion-check-tokens';
77
import { validateKubernetisMetricsReaderTokens } from './validations/kubernetis-metrics-reader-tokens';
88
import { validateMsGraphServiceAccountCredentials } from './validations/ms-graph-service-account-credentials';
99

10-
export const POST = createApiHandler({})(async () => {
10+
export const GET = createApiHandler({})(async () => {
1111
const [
1212
keycloakServiceAccountCredentials,
1313
keycloakUserLoginCredentials,
@@ -24,7 +24,7 @@ export const POST = createApiHandler({})(async () => {
2424
validateMsGraphServiceAccountCredentials(),
2525
]);
2626

27-
return NextResponse.json({
27+
return OkResponse({
2828
keycloakServiceAccountCredentials,
2929
keycloakUserLoginCredentials,
3030
kubernetisMetricsReaderTokens,
Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,24 @@
11
import axios from 'axios';
2-
import { BASE_URL } from '@/config';
3-
import { Cluster } from '@/prisma/client';
4-
5-
export function isClusterTokenPresent(getToken: (cluster: Cluster) => string, cluster: Cluster) {
6-
try {
7-
getToken(cluster);
8-
return true;
9-
} catch {
10-
return false;
11-
}
12-
}
132

143
async function getClientCredentialsToken(tokenUrl: string, clientId: string, clientSecret: string, scope?: string) {
15-
const params = new URLSearchParams();
16-
params.append('grant_type', 'client_credentials');
17-
params.append('client_id', clientId);
18-
params.append('client_secret', clientSecret);
19-
if (scope) params.append('scope', scope);
20-
21-
const res = await axios.post(tokenUrl, params, {
22-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
4+
const params = new URLSearchParams({
5+
grant_type: 'client_credentials',
6+
client_id: clientId,
7+
client_secret: clientSecret,
8+
});
9+
10+
if (scope) {
11+
params.append('scope', scope);
12+
}
13+
14+
const response = await axios.post<{ access_token?: string }>(tokenUrl, params.toString(), {
15+
headers: {
16+
'Content-Type': 'application/x-www-form-urlencoded',
17+
},
18+
timeout: 5000,
2319
});
2420

25-
return res.data.access_token;
21+
return response.data.access_token;
2622
}
2723

2824
export async function validateClientCredentials(
@@ -32,26 +28,26 @@ export async function validateClientCredentials(
3228
scope?: string,
3329
) {
3430
if (!(tokenUrl && clientId && clientSecret)) return false;
31+
3532
const token = await getClientCredentialsToken(tokenUrl, clientId, clientSecret, scope);
3633
return Boolean(token);
3734
}
3835

39-
export async function validateOAuthClientId(clientId: string) {
40-
const authUrl = `${process.env.AUTH_SERVER_URL}/realms/${process.env.AUTH_RELM}/protocol/openid-connect/auth`;
41-
36+
export async function validateOAuthClientId(authUrl: string, clientId: string, redirectUri: string) {
4237
const params = new URLSearchParams({
4338
client_id: clientId,
4439
response_type: 'code',
4540
scope: 'openid',
46-
redirect_uri: BASE_URL,
47-
state: 'test',
48-
nonce: 'test',
41+
redirect_uri: redirectUri,
42+
state: 'test_state',
43+
nonce: 'test_nonce',
4944
});
5045

51-
const response = await axios.get(`${authUrl}?${params.toString()}`, {
46+
const response = await axios.get<string>(`${authUrl}?${params.toString()}`, {
47+
timeout: 5000,
5248
maxRedirects: 0,
5349
validateStatus: () => true,
5450
});
5551

56-
return !response.status.toString().startsWith('4');
52+
return response.status < 400;
5753
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import { AUTH_RESOURCE } from '@/config';
1+
import { AUTH_RESOURCE, AUTH_SERVER_URL, AUTH_RELM, BASE_URL } from '@/config';
22
import { validateOAuthClientId } from './helpers';
33

44
export async function validateKeycloakUserLogin() {
5-
const isValid = await validateOAuthClientId(AUTH_RESOURCE);
5+
const authUrl = `${AUTH_SERVER_URL}/realms/${AUTH_RELM}/protocol/openid-connect/auth`;
6+
const isValid = await validateOAuthClientId(authUrl, AUTH_RESOURCE, BASE_URL);
7+
68
return isValid;
79
}

app/app/api/token-check/validations/kubernetis-deletion-check-tokens.ts

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
} from '@/config';
1010
import { Cluster } from '@/prisma/client';
1111
import { createK8sClusterConfigs } from '@/services/k8s/helpers';
12-
import { isClusterTokenPresent } from './helpers';
1312

1413
const { getK8sClusterToken, getK8sClusterClients } = createK8sClusterConfigs({
1514
[Cluster.KLAB]: KLAB_SERVICE_ACCOUNT_TOKEN,
@@ -24,17 +23,24 @@ const { getK8sClusterToken, getK8sClusterClients } = createK8sClusterConfigs({
2423
export async function validateKubernetisDeletionCheckTokens() {
2524
const results = {};
2625

27-
for (const cluster of Object.values(Cluster)) {
28-
if (!isClusterTokenPresent(getK8sClusterToken, cluster)) {
29-
results[cluster] = false;
30-
continue;
31-
}
26+
await Promise.all(
27+
Object.values(Cluster).map(async (cluster) => {
28+
try {
29+
const token = getK8sClusterToken(cluster);
30+
if (!token) {
31+
results[cluster] = false;
32+
return;
33+
}
3234

33-
const { authClient } = getK8sClusterClients(cluster);
34-
const res = await authClient.getAPIResources();
35+
const { authClient } = getK8sClusterClients(cluster);
36+
const res = await authClient.getAPIResources();
3537

36-
results[cluster] = !!res && Array.isArray(res.resources) && res.resources.length > 0;
37-
}
38+
results[cluster] = Array.isArray(res?.resources) && res.resources.length > 0;
39+
} catch (error) {
40+
results[cluster] = false;
41+
}
42+
}),
43+
);
3844

3945
return results;
4046
}

app/app/api/token-check/validations/kubernetis-metrics-reader-tokens.ts

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
} from '@/config';
1010
import { Cluster } from '@/prisma/client';
1111
import { createK8sClusterConfigs } from '@/services/k8s/helpers';
12-
import { isClusterTokenPresent } from './helpers';
1312

1413
const { getK8sClusterToken, getK8sClusterClients } = createK8sClusterConfigs({
1514
[Cluster.KLAB]: KLAB_METRICS_READER_TOKEN,
@@ -24,17 +23,24 @@ const { getK8sClusterToken, getK8sClusterClients } = createK8sClusterConfigs({
2423
export async function validateKubernetisMetricsReaderTokens() {
2524
const results = {};
2625

27-
for (const cluster of Object.values(Cluster)) {
28-
if (!isClusterTokenPresent(getK8sClusterToken, cluster)) {
29-
results[cluster] = false;
30-
continue;
31-
}
26+
await Promise.all(
27+
Object.values(Cluster).map(async (cluster) => {
28+
try {
29+
const token = getK8sClusterToken(cluster);
30+
if (!token) {
31+
results[cluster] = false;
32+
return;
33+
}
3234

33-
const { authClient } = getK8sClusterClients(cluster);
34-
const res = await authClient.getAPIResources();
35+
const { authClient } = getK8sClusterClients(cluster);
36+
const res = await authClient.getAPIResources();
3537

36-
results[cluster] = !!res && Array.isArray(res.resources) && res.resources.length > 0;
37-
}
38+
results[cluster] = Array.isArray(res?.resources) && res.resources.length > 0;
39+
} catch (error) {
40+
results[cluster] = false;
41+
}
42+
}),
43+
);
3844

3945
return results;
4046
}

app/services/k8s/helpers.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { KubeConfig, CoreV1Api, CustomObjectsApi, Metrics, AuthorizationV1Api } from '@kubernetes/client-node';
2+
import { logger } from '@/core/logging';
23
import { Cluster } from '@/prisma/client';
34

45
export function configureKubeConfig(cluster: string, token: string) {
@@ -45,8 +46,10 @@ export function createK8sClusterConfigs(tokens: Record<Cluster, string>) {
4546
const kc = k8sConfigs[cluster];
4647
const user = kc.getCurrentUser();
4748
if (!user?.token) {
48-
throw new Error(`Missing token in KubeConfig for cluster ${cluster}`);
49+
logger.error(`Missing token in KubeConfig for cluster ${cluster}`);
50+
return null;
4951
}
52+
5053
return user.token;
5154
}
5255

app/services/k8s/metrics/core.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export { getK8sClusterToken, getK8sClients };
4141
export async function queryPrometheus(query: string, cluster: Cluster) {
4242
const METRICS_URL = `https://prometheus-k8s-openshift-monitoring.apps.${cluster}.devops.gov.bc.ca`;
4343
const METRICS_TOKEN = getK8sClusterToken(cluster);
44+
4445
const response = await axios.get<PrometheusQueryResponse>(`${METRICS_URL}/api/v1/query`, {
4546
headers: { Authorization: `Bearer ${METRICS_TOKEN}` },
4647
params: { query },

0 commit comments

Comments
 (0)