Skip to content

Commit a5682d0

Browse files
authored
feat(core): ingress server local configuration filter (#314)
1 parent e74b416 commit a5682d0

3 files changed

Lines changed: 56 additions & 29 deletions

File tree

apps/cli/src/command/utils.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -202,17 +202,20 @@ const labelFilter = <T extends ADCSDK.Event['newValue']>(
202202
};
203203

204204
export const fillLabels = (
205-
configuration: ADCSDK.Configuration,
206-
rules: Record<string, string>,
205+
configuration: ADCSDK.Configuration = {},
206+
rules?: Record<string, string>,
207207
) => {
208-
const assignSelector = (labels: object) => Object.assign(labels ?? {}, rules);
208+
const assignSelector = (labels: ADCSDK.Labels) =>
209+
rules && Object.keys(rules).length > 0
210+
? Object.assign(labels ?? {}, rules)
211+
: labels;
209212

210213
for (const resourceType in configuration) {
211214
if (['global_rules', 'plugin_metadata'].includes(resourceType)) continue;
212215

213216
(configuration[resourceType] as Array<ADCSDK.Resource>).forEach(
214217
(resource) => {
215-
resource.labels = assignSelector(resource.labels as object);
218+
resource.labels = assignSelector(resource.labels as ADCSDK.Labels);
216219

217220
// Process the nested resources
218221
if (resourceType === 'services') {
@@ -237,17 +240,17 @@ export const fillLabels = (
237240
};
238241

239242
export const filterResourceType = (
240-
config: ADCSDK.Configuration,
241-
includes: Array<string>,
242-
excludes: Array<string>,
243+
config: ADCSDK.Configuration = {},
244+
includes?: Array<string>,
245+
excludes?: Array<string>,
243246
) => {
244247
const key = (item) =>
245248
item !== ADCSDK.ResourceType.PLUGIN_METADATA ? item.slice(0, -1) : item;
246249
return Object.fromEntries(
247250
Object.entries(config).filter(([resourceType]) => {
248251
return includes
249-
? includes.includes(key(resourceType))
250-
: !excludes.includes(key(resourceType));
252+
? includes?.includes(key(resourceType))
253+
: !excludes?.includes(key(resourceType));
251254
}),
252255
);
253256
};

apps/cli/src/server/schema.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import * as ADCSDK from '@api7/adc-sdk';
12
import { z } from 'zod';
23

34
const SyncTask = z.strictObject({
@@ -6,6 +7,9 @@ const SyncTask = z.strictObject({
67
server: z.url().min(1),
78
token: z.string().min(1),
89
lint: z.boolean().optional().default(true),
10+
includeResourceType: z.array(z.enum(ADCSDK.ResourceType)).optional(),
11+
excludeResourceType: z.array(z.enum(ADCSDK.ResourceType)).optional(),
12+
labelSelector: z.record(z.string(), z.string()).optional(),
913
}),
1014
config: z.looseObject({}),
1115
});

apps/cli/src/server/sync.ts

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ import type { RequestHandler } from 'express';
33
import { omit, toString } from 'lodash';
44
import { lastValueFrom, toArray } from 'rxjs';
55

6-
import { loadBackend } from '../command/utils';
6+
import {
7+
fillLabels,
8+
filterConfiguration,
9+
filterResourceType,
10+
loadBackend,
11+
} from '../command/utils';
712
import { DifferV3 } from '../differ/differv3';
813
import { check } from '../linter';
914
import { SyncInput, type SyncInputType } from './schema';
@@ -13,29 +18,44 @@ export const syncHandler: RequestHandler<
1318
unknown,
1419
SyncInputType
1520
> = async (req, res) => {
16-
const parsedInput = SyncInput.safeParse(req.body);
17-
if (!parsedInput.success)
18-
return res.status(400).json({
19-
message: parsedInput.error.message,
20-
errors: parsedInput.error.issues,
21-
});
22-
const { task } = parsedInput.data;
23-
24-
// load local configuration and validate it
25-
const local = task.config as ADCSDK.Configuration;
26-
if (task.opts.lint) {
27-
const result = check(local);
28-
if (!result.success)
21+
try {
22+
const parsedInput = SyncInput.safeParse(req.body);
23+
if (!parsedInput.success)
2924
return res.status(400).json({
30-
message: result.error.message,
31-
errors: result.error.issues,
25+
message: parsedInput.error.message,
26+
errors: parsedInput.error.issues,
3227
});
33-
}
28+
const { task } = parsedInput.data;
3429

35-
try {
36-
// load remote configuration and diff with local
30+
// load local configuration and validate it
31+
//TODO: merged with the listr task
32+
const local = filterResourceType(
33+
task.config,
34+
task.opts.includeResourceType,
35+
task.opts.excludeResourceType,
36+
) as ADCSDK.Configuration;
37+
if (task.opts.lint) {
38+
const result = check(local);
39+
if (!result.success)
40+
return res.status(400).json({
41+
message: result.error.message,
42+
errors: result.error.issues,
43+
});
44+
}
45+
fillLabels(local, task.opts.labelSelector);
46+
47+
// load and filter remote configuration
48+
//TODO: merged with the listr task
3749
const backend = loadBackend(task.opts.backend, { ...task.opts });
38-
const remote = await lastValueFrom(backend.dump());
50+
let remote = await lastValueFrom(backend.dump());
51+
remote = filterResourceType(
52+
remote,
53+
task.opts.includeResourceType,
54+
task.opts.excludeResourceType,
55+
);
56+
[remote] = filterConfiguration(remote, task.opts.labelSelector);
57+
58+
// diff local and remote configuration
3959
const diff = DifferV3.diff(local, remote, await backend.defaultValue());
4060

4161
// sync the diff

0 commit comments

Comments
 (0)