Skip to content

Commit

Permalink
fix(helm-requirements): validate fields (#8227)
Browse files Browse the repository at this point in the history
* refactor(helm-requirements): harden validation of requirements.yaml file

check for the presence of name, version and repository fields

* refactor(helm-requirements): harden validation of requirements.yaml file

check for the presence of name, version and repository fields

* refactor(helm-requirements): skip fields in order -> name, version, repository

* chore(helm-requirements): fix linting rules

* chore(helm-requirements): rename https://kubernetes-charts.storage.googleapis.com to https://charts.helm.sh/stable

Co-authored-by: Rhys Arkins <rhys@arkins.net>
  • Loading branch information
eh-am and rarkins committed Jan 11, 2021
1 parent 57e5506 commit f6cf6fa
Show file tree
Hide file tree
Showing 3 changed files with 166 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ Object {
"currentValue": "0.9.0",
"depName": "redis",
"registryUrls": Array [
"https://kubernetes-charts.storage.googleapis.com/",
"https://charts.helm.sh/stable/",
],
},
Object {
"currentValue": "0.8.1",
"depName": "postgresql",
"registryUrls": Array [
"https://kubernetes-charts.storage.googleapis.com/",
"https://charts.helm.sh/stable/",
],
},
],
Expand Down Expand Up @@ -74,7 +74,7 @@ Object {
"currentValue": "0.9.0",
"depName": "redis",
"registryUrls": Array [
"https://kubernetes-charts.storage.googleapis.com/",
"https://charts.helm.sh/stable/",
],
},
Object {
Expand Down
143 changes: 130 additions & 13 deletions lib/manager/helm-requirements/extract.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { fs } from '../../../test/util';
import { SkipReason } from '../../types';
import { extractPackageFile } from './extract';

jest.mock('../../util/fs');
Expand Down Expand Up @@ -31,7 +32,7 @@ describe('lib/manager/helm-requirements/extract', () => {
const fileName = 'requirements.yaml';
const result = await extractPackageFile(content, fileName, {
aliases: {
stable: 'https://kubernetes-charts.storage.googleapis.com/',
stable: 'https://charts.helm.sh/stable/',
},
});
expect(result).not.toBeNull();
Expand All @@ -50,15 +51,15 @@ describe('lib/manager/helm-requirements/extract', () => {
dependencies:
- name: redis
version: 0.9.0
repository: https://kubernetes-charts.storage.googleapis.com/
repository: https://charts.helm.sh/stable/
- name: postgresql
version: 0.8.1
repository: https://kubernetes-charts.storage.googleapis.com/
repository: https://charts.helm.sh/stable/
`;
const fileName = 'requirements.yaml';
const result = await extractPackageFile(content, fileName, {
aliases: {
stable: 'https://kubernetes-charts.storage.googleapis.com/',
stable: 'https://charts.helm.sh/stable/',
},
});
expect(result).not.toBeNull();
Expand All @@ -74,7 +75,7 @@ describe('lib/manager/helm-requirements/extract', () => {
const fileName = 'requirements.yaml';
const result = await extractPackageFile('', fileName, {
aliases: {
stable: 'https://kubernetes-charts.storage.googleapis.com/',
stable: 'https://charts.helm.sh/stable/',
},
});
expect(result).toBeNull();
Expand Down Expand Up @@ -113,15 +114,15 @@ describe('lib/manager/helm-requirements/extract', () => {
dependencies:
- name: redis
version: 0.9.0
repository: https://kubernetes-charts.storage.googleapis.com/
repository: https://charts.helm.sh/stable/
- name: postgresql
version: 0.8.1
repository: https://kubernetes-charts.storage.googleapis.com/
repository: https://charts.helm.sh/stable/
`;
const fileName = 'requirements.yaml';
const result = await extractPackageFile(content, fileName, {
aliases: {
stable: 'https://kubernetes-charts.storage.googleapis.com/',
stable: 'https://charts.helm.sh/stable/',
},
});
expect(result).toBeNull();
Expand All @@ -138,15 +139,15 @@ describe('lib/manager/helm-requirements/extract', () => {
dependencies:
- name: redis
version: 0.9.0
repository: https://kubernetes-charts.storage.googleapis.com/
repository: https://charts.helm.sh/stable/
- name: postgresql
version: 0.8.1
repository: file:///some/local/path/
`;
const fileName = 'requirements.yaml';
const result = await extractPackageFile(content, fileName, {
aliases: {
stable: 'https://kubernetes-charts.storage.googleapis.com/',
stable: 'https://charts.helm.sh/stable/',
},
});
expect(result).not.toBeNull();
Expand All @@ -166,7 +167,7 @@ describe('lib/manager/helm-requirements/extract', () => {
const fileName = 'requirements.yaml';
const result = await extractPackageFile(content, fileName, {
aliases: {
stable: 'https://kubernetes-charts.storage.googleapis.com/',
stable: 'https://charts.helm.sh/stable/',
},
});
expect(result).toBeNull();
Expand All @@ -187,7 +188,7 @@ describe('lib/manager/helm-requirements/extract', () => {
const fileName = 'requirements.yaml';
const result = await extractPackageFile(content, fileName, {
aliases: {
stable: 'https://kubernetes-charts.storage.googleapis.com/',
stable: 'https://charts.helm.sh/stable/',
},
});
expect(result).toBeNull();
Expand All @@ -197,10 +198,126 @@ describe('lib/manager/helm-requirements/extract', () => {
const fileName = 'requirements.yaml';
const result = await extractPackageFile(content, fileName, {
aliases: {
stable: 'https://kubernetes-charts.storage.googleapis.com/',
stable: 'https://charts.helm.sh/stable/',
},
});
expect(result).toBeNull();
});

describe.each([
{
content: `
dependencies:
- {}
`,
fieldName: 'name',
want: {
datasource: 'helm',
deps: [
{
currentValue: undefined,
depName: undefined,
skipReason: SkipReason.InvalidName,
},
],
},
},
{
content: `
dependencies:
- name: postgres
`,
fieldName: 'version',
want: {
datasource: 'helm',
deps: [
{
currentValue: undefined,
depName: 'postgres',
skipReason: SkipReason.InvalidVersion,
},
],
},
},
{
content: `
dependencies:
- name: postgres
version: 0.1.0
`,
fieldName: 'repository',
want: {
datasource: 'helm',
deps: [
{
currentValue: '0.1.0',
depName: 'postgres',
skipReason: SkipReason.NoRepository,
},
],
},
},
])('validates required fields', (params) => {
it(`validates ${params.fieldName} is required`, async () => {
fs.readLocalFile.mockResolvedValueOnce(`
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: example
version: 0.1.0
`);
const fileName = 'requirements.yaml';
const result = await extractPackageFile(params.content, fileName, {});
expect(result).toEqual(params.want);
});
});
it('skips only invalid dependences', async () => {
fs.readLocalFile.mockResolvedValueOnce(`
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: example
version: 0.1.0
`);
const content = `
dependencies:
- name: postgresql
repository: https://charts.helm.sh/stable/
- version: 0.0.1
repository: https://charts.helm.sh/stable/
- name: redis
version: 0.0.1
- name: redis
version: 0.0.1
repository: https://charts.helm.sh/stable/
`;
const fileName = 'requirements.yaml';
const result = await extractPackageFile(content, fileName, {});
expect(result).toEqual({
datasource: 'helm',
deps: [
{
currentValue: undefined,
depName: 'postgresql',
skipReason: 'invalid-version',
},
{
currentValue: '0.0.1',
depName: undefined,
skipReason: 'invalid-name',
},
{
currentValue: '0.0.1',
depName: 'redis',
skipReason: 'no-repository',
},
{
currentValue: '0.0.1',
depName: 'redis',
registryUrls: ['https://charts.helm.sh/stable/'],
},
],
});
});
});
});
54 changes: 33 additions & 21 deletions lib/manager/helm-requirements/extract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,30 +48,42 @@ export async function extractPackageFile(
depName: dep.name,
currentValue: dep.version,
};
if (dep.repository) {
res.registryUrls = [dep.repository];
if (dep.repository.startsWith('@')) {
const repoWithAtRemoved = dep.repository.slice(1);
const alias = config.aliases[repoWithAtRemoved];
if (alias) {
res.registryUrls = [alias];
return res;
}

res.skipReason = SkipReason.PlaceholderUrl;
} else {
try {
const url = new URL(dep.repository);
if (url.protocol === 'file:') {
res.skipReason = SkipReason.LocalDependency;
}
} catch (err) {
logger.debug({ err }, 'Error parsing url');
res.skipReason = SkipReason.InvalidUrl;
}
if (!res.depName) {
res.skipReason = SkipReason.InvalidName;
return res;
}

if (!res.currentValue) {
res.skipReason = SkipReason.InvalidVersion;
return res;
}

if (!dep.repository) {
res.skipReason = SkipReason.NoRepository;
return res;
}

res.registryUrls = [dep.repository];
if (dep.repository.startsWith('@')) {
const repoWithAtRemoved = dep.repository.slice(1);
const alias = config.aliases[repoWithAtRemoved];
if (alias) {
res.registryUrls = [alias];
return res;
}

res.skipReason = SkipReason.PlaceholderUrl;
} else {
res.skipReason = SkipReason.NoRepository;
try {
const url = new URL(dep.repository);
if (url.protocol === 'file:') {
res.skipReason = SkipReason.LocalDependency;
}
} catch (err) {
logger.debug({ err }, 'Error parsing url');
res.skipReason = SkipReason.InvalidUrl;
}
}
return res;
});
Expand Down

0 comments on commit f6cf6fa

Please sign in to comment.