renovate/lib/modules/manager/helmfile/extract.spec.ts

515 lines
14 KiB
TypeScript

import { codeBlock } from 'common-tags';
import { Fixtures } from '../../../../test/fixtures';
import { fs } from '../../../../test/util';
import { GlobalConfig } from '../../../config/global';
import { FILE_ACCESS_VIOLATION_ERROR } from '../../../constants/error-messages';
import { extractPackageFile } from '.';
jest.mock('../../../util/fs');
const localDir = '/tmp/github/some/repo';
describe('modules/manager/helmfile/extract', () => {
describe('extractPackageFile()', () => {
beforeEach(() => {
GlobalConfig.set({ localDir });
});
it('skip null YAML document', async () => {
const content = codeBlock`
~
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).toBeNull();
});
it('returns null if no releases', async () => {
const content = `
repositories:
- name: kiwigrid
url: https://kiwigrid.github.io
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).toBeNull();
});
it('do not crash on invalid helmfile.yaml', async () => {
const content = `
repositories:
- name: kiwigrid
url: https://kiwigrid.github.io
releases: [
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).toBeNull();
});
it('skip if repository details are not specified', async () => {
const content = `
repositories:
- name: kiwigrid
url: https://kiwigrid.github.io
releases:
- name: example
version: 1.0.0
chart: experimental/example
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).not.toBeNull();
expect(result).toMatchSnapshot();
expect(result?.deps.every((dep) => dep.skipReason)).toBeTruthy();
});
it('skip templetized release with invalid characters', async () => {
const content = `
repositories:
- name: kiwigrid
url: https://kiwigrid.github.io
releases:
- name: example
version: 1.0.0
chart: stable/!!!!--!
- name: example-internal
version: 1.0.0
chart: stable/example
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).toMatchSnapshot({
datasource: 'helm',
deps: [
{
currentValue: '1.0.0',
skipReason: 'unsupported-chart-type',
},
{
currentValue: '1.0.0',
depName: 'example',
},
],
});
});
it('skip local charts', async () => {
const content = `
repositories:
- name: kiwigrid
url: https://kiwigrid.github.io
releases:
- name: example
version: 1.0.0
chart: ./charts/example
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).not.toBeNull();
expect(result).toMatchSnapshot();
expect(result?.deps.every((dep) => dep.skipReason)).toBeTruthy();
});
it('skip chart with unknown repository', async () => {
const content = `
repositories:
- name: kiwigrid
url: https://kiwigrid.github.io
releases:
- name: example
version: 1.0.0
chart: example
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).not.toBeNull();
expect(result).toMatchSnapshot();
expect(result?.deps.every((dep) => dep.skipReason)).toBeTruthy();
});
it('skip chart with special character in the name', async () => {
const content = `
repositories:
- name: kiwigrid
url: https://kiwigrid.github.io
releases:
- name: example
version: 1.0.0
chart: kiwigrid/example/example
- name: example2
version: 1.0.0
chart: kiwigrid/example?example
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).not.toBeNull();
expect(result).toMatchSnapshot();
expect(result?.deps.every((dep) => dep.skipReason)).toBeTruthy();
});
it('skip chart that does not have specified version', async () => {
const content = `
repositories:
- name: kiwigrid
url: https://kiwigrid.github.io
releases:
- name: example
chart: stable/example
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).not.toBeNull();
expect(result).toMatchSnapshot();
expect(result?.deps.every((dep) => dep.skipReason)).toBeTruthy();
});
it('parses multidoc yaml', async () => {
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(
Fixtures.get('multidoc.yaml'),
fileName,
{
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
},
);
expect(result).toMatchObject({
datasource: 'helm',
deps: [
{ depName: 'manifests', skipReason: 'local-chart' },
{
depName: 'rabbitmq',
currentValue: '7.4.3',
registryUrls: ['https://charts.bitnami.com/bitnami'],
},
{
depName: 'kube-prometheus-stack',
currentValue: '13.7',
registryUrls: [
'https://prometheus-community.github.io/helm-charts',
],
},
{ depName: 'external-dns', skipReason: 'invalid-version' },
{
depName: 'raw',
currentValue: '0.1.0',
registryUrls: ['https://charts.helm.sh/incubator/'],
},
],
managerData: { needKustomize: true },
});
});
it('parses a chart with a go templating', async () => {
const content = `
repositories:
- name: kiwigrid
url: https://kiwigrid.github.io
releases:
- name: example
{{- if neq .Values.example.version "" }}
version: {{ .Values.example.version }}
{{- else }}
version: 1.0.0
{{- end }}
chart: stable/example
- name: example-internal
version: 1.0.0
chart: stable/example
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).toMatchObject({
datasource: 'helm',
deps: [
{
currentValue: '1.0.0',
depName: 'example',
},
{
currentValue: '1.0.0',
depName: 'example',
},
],
});
});
it('parses a chart with empty strings for template values', async () => {
const content = `
repositories:
- name: kiwigrid
url: https://kiwigrid.github.io
releases:
- name: example
version: {{ .Values.example.version }}
chart: stable/example
- name: example-external
version: 1.0.0
chart: {{ .Values.example.repository }}
- name: example-internal
version: 1.0.0
chart: stable/example
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).toMatchObject({
datasource: 'helm',
deps: [
{
skipReason: 'invalid-version',
},
{
currentValue: '1.0.0',
depName: 'example',
},
],
});
});
it('parses a chart with an oci repository and non-oci one', async () => {
const content = `
repositories:
- name: oci-repo
url: ghcr.io/example/oci-repo
oci: true
- name: jenkins
url: https://charts.jenkins.io
releases:
- name: example
version: 0.1.0
chart: oci-repo/example
- name: jenkins
chart: jenkins/jenkins
version: 3.3.0
- name: oci-url
version: 0.4.2
chart: oci://ghcr.io/example/oci-repo/url-example
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).toMatchObject({
datasource: 'helm',
deps: [
{
currentValue: '0.1.0',
depName: 'example',
datasource: 'docker',
packageName: 'ghcr.io/example/oci-repo/example',
},
{
currentValue: '3.3.0',
depName: 'jenkins',
registryUrls: ['https://charts.jenkins.io'],
},
{
currentValue: '0.4.2',
depName: 'url-example',
datasource: 'docker',
packageName: 'ghcr.io/example/oci-repo/url-example',
},
],
});
});
it('parses a chart with an oci repository with ---', async () => {
const content = codeBlock`
repositories:
- name: oci-repo
url: ghcr.io/example/oci-repo
oci: true
---
releases:
- name: example
version: 0.1.0
chart: oci-repo/example
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).toMatchObject({
datasource: 'helm',
deps: [
{
currentValue: '0.1.0',
depName: 'example',
datasource: 'docker',
packageName: 'ghcr.io/example/oci-repo/example',
},
],
});
});
it('parses and replaces templating strings', async () => {
const filename = 'helmfile.yaml';
fs.localPathExists.mockReturnValue(Promise.resolve(true));
const result = await extractPackageFile(
Fixtures.get('go-template.yaml'),
filename,
{
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
},
);
expect(result).toMatchObject({
datasource: 'helm',
deps: [
{
depName: '',
skipReason: 'local-chart',
},
{
depName: '',
skipReason: 'local-chart',
},
{
depName: '',
skipReason: 'local-chart',
},
{
depName: 'ingress-nginx',
currentValue: '3.37.0',
registryUrls: [],
skipReason: 'unknown-registry',
},
{
depName: 'memcached',
currentValue: '6.0.0',
registryUrls: ['https://charts.bitnami.com/bitnami'],
},
{
depName: 'example',
currentValue: '1.30.0',
registryUrls: ['https://charts.helm.sh/stable'],
},
{ depName: 'kube-prometheus-stack', skipReason: 'invalid-version' },
{
depName: 'external-dns',
currentValue: '2.0.0',
registryUrls: ['https://charts.helm.sh/stable'],
},
],
managerData: { needKustomize: true },
});
});
it('detects kustomize and respects relative paths', async () => {
fs.localPathExists.mockImplementationOnce((path) => {
if (!path.startsWith(GlobalConfig.get('localDir', ''))) {
throw new Error(FILE_ACCESS_VIOLATION_ERROR);
}
return Promise.resolve(true);
});
const parentDir = `${localDir}/project`;
fs.getParentDir.mockReturnValue(parentDir);
const result = await extractPackageFile(
Fixtures.get('uses-kustomization.yaml'),
`${parentDir}/helmfile.yaml`, // In subdir
{
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
},
);
expect(result).toMatchObject({
datasource: 'helm',
deps: [
{
depName: 'my-chart',
skipReason: 'local-chart',
},
{
depName: 'memcached',
currentValue: '6.0.0',
registryUrls: ['https://charts.bitnami.com/bitnami'],
},
],
managerData: { needKustomize: true },
});
});
it('makes sure url joiner works correctly', async () => {
const content = codeBlock`
releases:
- name: argocd
version: 0.4.2
chart: oci://gitlab.example.com:5000/group/subgroup
`;
const fileName = 'helmfile.yaml';
const result = await extractPackageFile(content, fileName, {
registryAliases: {
stable: 'https://charts.helm.sh/stable',
},
});
expect(result).toMatchObject({
datasource: 'helm',
deps: [
{
currentValue: '0.4.2',
datasource: 'docker',
depName: 'subgroup',
packageName: 'gitlab.example.com:5000/group/subgroup',
registryUrls: [],
},
],
});
});
});
});