Skip to content

Commit 9fd9f4c

Browse files
authored
refactor(kubernetes): use zod schema to extract API versions (renovatebot#41933)
* refactor(kubernetes): use zod schema to extract API versions * fix corrupted indentation of fixture
1 parent 67b2b88 commit 9fd9f4c

File tree

4 files changed

+21
-36
lines changed

4 files changed

+21
-36
lines changed

lib/modules/manager/kubernetes/__fixtures__/kubernetes.registry-alias.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ metadata:
77
spec:
88
containers:
99
- name: node
10-
image: quay.io/node:0.0.1
11-
ports:
12-
- containerPort: 80
10+
image: quay.io/node:0.0.1
11+
ports:
12+
- containerPort: 80

lib/modules/manager/kubernetes/extract.ts

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import { isNonEmptyStringAndNotWhitespace, isTruthy } from '@sindresorhus/is';
21
import { logger } from '../../../logger/index.ts';
32
import { newlineRegex, regEx } from '../../../util/regex.ts';
4-
import { parseYaml } from '../../../util/yaml.ts';
3+
import { withDebugMessage } from '../../../util/schema-utils/index.ts';
54
import {
65
KubernetesApiDatasource,
76
supportedApis,
@@ -13,7 +12,7 @@ import type {
1312
PackageDependency,
1413
PackageFileContent,
1514
} from '../types.ts';
16-
import type { KubernetesConfiguration } from './types.ts';
15+
import { type KubernetesManifest, KubernetesManifests } from './schema.ts';
1716

1817
export function extractPackageFile(
1918
content: string,
@@ -29,9 +28,13 @@ export function extractPackageFile(
2928
return null;
3029
}
3130

31+
const manifests = KubernetesManifests.catch(
32+
withDebugMessage([], `${packageFile} does not match Kubernetes schema`),
33+
).parse(content);
34+
3235
const deps: PackageDependency[] = [
3336
...extractImages(content, config),
34-
...extractApis(content, packageFile),
37+
...extractApis(manifests),
3538
];
3639

3740
return deps.length ? { deps } : null;
@@ -71,29 +74,8 @@ function extractImages(
7174
return deps;
7275
}
7376

74-
function extractApis(
75-
content: string,
76-
packageFile: string,
77-
): PackageDependency[] {
78-
let doc: KubernetesConfiguration[];
79-
80-
try {
81-
// TODO: use schema (#9610)
82-
doc = parseYaml(content, {
83-
removeTemplates: true,
84-
});
85-
} catch (err) {
86-
logger.debug({ err, packageFile }, 'Failed to parse Kubernetes manifest.');
87-
return [];
88-
}
89-
90-
return doc
91-
.filter(isTruthy)
92-
.filter(
93-
(m) =>
94-
isNonEmptyStringAndNotWhitespace(m.kind) &&
95-
isNonEmptyStringAndNotWhitespace(m.apiVersion),
96-
)
77+
function extractApis(manifests: KubernetesManifest[]): PackageDependency[] {
78+
return manifests
9779
.filter((m) => supportedApis.has(m.kind))
9880
.map((configuration) => ({
9981
depName: configuration.kind,
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
import { z } from 'zod/v3';
2+
import { LooseArray, multidocYaml } from '../../../util/schema-utils/index.ts';
23

34
export const KubernetesResource = z.object({
4-
apiVersion: z.string(),
5-
kind: z.string(),
5+
apiVersion: z.string().trim().min(1),
6+
kind: z.string().trim().min(1),
67
metadata: z.object({
78
name: z.string(),
89
namespace: z.string().optional(),
910
}),
1011
});
12+
13+
export type KubernetesManifest = z.infer<typeof KubernetesResource>;
14+
15+
export const KubernetesManifests = multidocYaml({
16+
removeTemplates: true,
17+
}).pipe(LooseArray(KubernetesResource));

lib/modules/manager/kubernetes/types.ts

Lines changed: 0 additions & 4 deletions
This file was deleted.

0 commit comments

Comments
 (0)