mirror of
https://github.com/renovatebot/renovate.git
synced 2026-10-31 17:51:49 +00:00
be13c9f5f7
* feat(manager): share OCI Helm chart resolution across managers Add getOciChartDep() to helmv3/oci.ts and use it in argocd, fleet, flux, helmfile, helmsman, helmv3, kustomize, sveltos, terraform and vendir. - set pinDigests: false for OCI charts in all of them - apply registryAliases to OCI charts in argocd, helmfile and helmsman - keep the registry port in terraform helm_release repositories - skip fleet OCI charts without a version instead of using 'undefined' * docs(manager/helmv3): correct the OCI chart pinDigests rationale * refactor(manager/helmfile): drop redundant OCI repository url guard The repository schema already requires url to be a string, so the falsy branch could not be reached by parsed input and left the patch partially covered.
610 lines
19 KiB
TypeScript
610 lines
19 KiB
TypeScript
import { codeBlock } from 'common-tags';
|
|
import { extractDefinition } from './extract.ts';
|
|
import { extractPackageFile } from './index.ts';
|
|
import type { ProfileDefinition } from './schema.ts';
|
|
|
|
const malformedProfiles = codeBlock`
|
|
---
|
|
# malformed eventtrigger as the source is null
|
|
apiVersion: lib.projectsveltos.io/v1beta1
|
|
kind: EventTrigger
|
|
spec:
|
|
helmCharts: []
|
|
---
|
|
# malformed eventtrigger as the source is empty
|
|
apiVersion: lib.projectsveltos.io/v1beta1
|
|
kind: EventTrigger
|
|
spec:
|
|
helmCharts: null
|
|
---
|
|
# malformed clusterprofile as the sources array is empty
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: ClusterProfile
|
|
spec:
|
|
helmCharts: []
|
|
---
|
|
# malformed clusterprofile as the source is null
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: ClusterProfile
|
|
spec:
|
|
helmCharts: null
|
|
---
|
|
# malformed profile as the sources array is empty
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: Profile
|
|
spec:
|
|
helmCharts: []
|
|
---
|
|
# malformed profile as the source is null
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: Profile
|
|
spec:
|
|
helmCharts: null
|
|
---
|
|
# malformed clusterPromotion as the sources array is empty
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: ClusterPromotion
|
|
spec:
|
|
profileSpec:
|
|
helmCharts: []
|
|
---
|
|
# malformed clusterPromotion as the source is null
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: ClusterPromotion
|
|
spec:
|
|
profileSpec:
|
|
helmCharts: null
|
|
`;
|
|
describe('modules/manager/sveltos/extract', () => {
|
|
describe('extractDefinition()', () => {
|
|
it('returns an empty array when parsing fails', () => {
|
|
const invalidDefinition = {};
|
|
const result = extractDefinition(invalidDefinition as ProfileDefinition);
|
|
expect(result).toEqual([]);
|
|
});
|
|
|
|
it('returns null if extractDefinition returns an empty array', () => {
|
|
const validYAML = codeBlock`
|
|
apiVersion: "config.projectsveltos.io/v1beta1"
|
|
kind: ClusterProfile
|
|
metadata:
|
|
name: empty-profile
|
|
`;
|
|
|
|
const result = extractPackageFile(validYAML, 'valid-yaml.yml');
|
|
expect(result).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('extractPackageFile()', () => {
|
|
it('returns null for empty', () => {
|
|
expect(extractPackageFile('nothing here', 'sveltos.yml')).toBeNull();
|
|
});
|
|
|
|
it('returns null for invalid', () => {
|
|
expect(
|
|
extractPackageFile(`${malformedProfiles}\n123`, 'sveltos.yml'),
|
|
).toBeNull();
|
|
});
|
|
|
|
it('return null for Kubernetes manifest', () => {
|
|
const randomManifest = codeBlock`
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: nginx-deployment
|
|
labels:
|
|
app: nginx
|
|
spec:
|
|
replicas: 3
|
|
selector:
|
|
matchLabels:
|
|
app: nginx
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: nginx
|
|
spec:
|
|
containers:
|
|
- name: nginx
|
|
image: nginx:1.14.2
|
|
ports:
|
|
- containerPort: 80
|
|
`;
|
|
const result = extractPackageFile(randomManifest, 'sveltos.yml');
|
|
expect(result).toBeNull();
|
|
});
|
|
|
|
it('return null if deps array would be empty', () => {
|
|
const result = extractPackageFile(malformedProfiles, 'applications.yml');
|
|
expect(result).toBeNull();
|
|
});
|
|
|
|
it('return null if YAML is invalid', () => {
|
|
const result = extractPackageFile(
|
|
codeBlock`
|
|
----
|
|
apiVersion: "config.projectsveltos.io/v1beta1"
|
|
kind ClusterProfile
|
|
metadata:
|
|
name: prometheus
|
|
`,
|
|
'invalid-yaml.yml',
|
|
);
|
|
expect(result).toBeNull();
|
|
});
|
|
|
|
it('return result for double quoted projectsveltos.io apiVersion reference', () => {
|
|
const result = extractPackageFile(
|
|
codeBlock`
|
|
apiVersion: "config.projectsveltos.io/v1beta1"
|
|
kind: ClusterProfile
|
|
metadata:
|
|
name: prometheus
|
|
spec:
|
|
helmCharts:
|
|
- repositoryURL: https://prometheus-community.github.io/helm-charts
|
|
repositoryName: prometheus-community
|
|
chartName: prometheus-community/prometheus
|
|
chartVersion: "23.4.0"
|
|
`,
|
|
'sveltos.yml',
|
|
);
|
|
expect(result).toMatchObject({
|
|
deps: [
|
|
{
|
|
currentValue: '23.4.0',
|
|
datasource: 'helm',
|
|
depType: 'ClusterProfile',
|
|
depName: 'prometheus-community/prometheus',
|
|
packageName: 'prometheus',
|
|
registryUrls: [
|
|
'https://prometheus-community.github.io/helm-charts',
|
|
],
|
|
},
|
|
],
|
|
});
|
|
});
|
|
|
|
it('return result for single quoted projectsveltos.io apiVersion reference', () => {
|
|
const result = extractPackageFile(
|
|
codeBlock`
|
|
apiVersion: 'config.projectsveltos.io/v1beta1'
|
|
kind: ClusterProfile
|
|
metadata:
|
|
name: prometheus
|
|
spec:
|
|
helmCharts:
|
|
- repositoryURL: https://prometheus-community.github.io/helm-charts
|
|
repositoryName: prometheus-community
|
|
chartName: prometheus-community/prometheus
|
|
chartVersion: "23.4.0"
|
|
`,
|
|
'applications.yml',
|
|
);
|
|
expect(result).toMatchObject({
|
|
deps: [
|
|
{
|
|
currentValue: '23.4.0',
|
|
datasource: 'helm',
|
|
depType: 'ClusterProfile',
|
|
depName: 'prometheus-community/prometheus',
|
|
packageName: 'prometheus',
|
|
registryUrls: [
|
|
'https://prometheus-community.github.io/helm-charts',
|
|
],
|
|
},
|
|
],
|
|
});
|
|
});
|
|
|
|
it('supports profiles', () => {
|
|
const validProfile = codeBlock`
|
|
---
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: Profile
|
|
metadata:
|
|
name: baseline
|
|
spec:
|
|
helmCharts:
|
|
- repositoryURL: https://prometheus-community.github.io/helm-charts
|
|
repositoryName: prometheus-community
|
|
chartName: prometheus-community/prometheus
|
|
chartVersion: "23.4.0"
|
|
- repositoryURL: https://kyverno.github.io/kyverno/
|
|
repositoryName: kyverno
|
|
chartName: kyverno/kyverno
|
|
chartVersion: "v3.2.5"
|
|
---
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: Profile
|
|
metadata:
|
|
name: kyverno
|
|
spec:
|
|
helmCharts:
|
|
- repositoryURL: https://kyverno.github.io/kyverno/
|
|
repositoryName: kyverno
|
|
chartName: kyverno/kyverno-policies
|
|
chartVersion: v3.2.0
|
|
releaseName: kyverno-latest
|
|
releaseNamespace: kyverno
|
|
helmChartAction: Install
|
|
values: |
|
|
admissionController:
|
|
replicas: 1
|
|
---
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: Profile
|
|
metadata:
|
|
name: vault
|
|
spec:
|
|
syncMode: Continuous
|
|
helmCharts:
|
|
- repositoryURL: oci://registry-1.docker.io/bitnamicharts
|
|
repositoryName: oci-vault
|
|
chartName: vault
|
|
chartVersion: 0.7.2
|
|
- repositoryURL: oci://custom-registry:443/charts
|
|
repositoryName: oci-custom-vault
|
|
chartName: vault-sidecar
|
|
chartVersion: 0.5.0
|
|
`;
|
|
const result = extractPackageFile(validProfile, 'profiles.yml');
|
|
expect(result).toEqual({
|
|
deps: [
|
|
{
|
|
currentValue: '23.4.0',
|
|
datasource: 'helm',
|
|
depType: 'Profile',
|
|
depName: 'prometheus-community/prometheus',
|
|
packageName: 'prometheus',
|
|
registryUrls: [
|
|
'https://prometheus-community.github.io/helm-charts',
|
|
],
|
|
},
|
|
{
|
|
currentValue: 'v3.2.5',
|
|
datasource: 'helm',
|
|
depType: 'Profile',
|
|
depName: 'kyverno/kyverno',
|
|
packageName: 'kyverno',
|
|
registryUrls: ['https://kyverno.github.io/kyverno/'],
|
|
},
|
|
{
|
|
currentValue: 'v3.2.0',
|
|
datasource: 'helm',
|
|
depType: 'Profile',
|
|
depName: 'kyverno/kyverno-policies',
|
|
packageName: 'kyverno-policies',
|
|
registryUrls: ['https://kyverno.github.io/kyverno/'],
|
|
},
|
|
{
|
|
currentValue: '0.7.2',
|
|
datasource: 'docker',
|
|
depType: 'Profile',
|
|
depName: 'vault',
|
|
packageName: 'registry-1.docker.io/bitnamicharts/vault',
|
|
pinDigests: false,
|
|
},
|
|
{
|
|
currentValue: '0.5.0',
|
|
datasource: 'docker',
|
|
depType: 'Profile',
|
|
depName: 'vault-sidecar',
|
|
packageName: 'custom-registry:443/charts/vault-sidecar',
|
|
pinDigests: false,
|
|
},
|
|
],
|
|
});
|
|
});
|
|
|
|
it('supports clusterprofiles', () => {
|
|
const validClusterProfile = codeBlock`
|
|
---
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: ClusterProfile
|
|
metadata:
|
|
name: baseline
|
|
spec:
|
|
helmCharts:
|
|
- repositoryURL: https://prometheus-community.github.io/helm-charts
|
|
repositoryName: prometheus-community
|
|
chartName: prometheus-community/prometheus
|
|
chartVersion: "23.4.0"
|
|
- repositoryURL: https://kyverno.github.io/kyverno/
|
|
repositoryName: kyverno
|
|
chartName: kyverno/kyverno
|
|
chartVersion: "v3.2.5"
|
|
---
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: ClusterProfile
|
|
metadata:
|
|
name: kyverno
|
|
spec:
|
|
helmCharts:
|
|
- repositoryURL: https://kyverno.github.io/kyverno/
|
|
repositoryName: kyverno
|
|
chartName: kyverno/kyverno-policies
|
|
chartVersion: v3.2.0
|
|
releaseName: kyverno-latest
|
|
releaseNamespace: kyverno
|
|
helmChartAction: Install
|
|
values: |
|
|
admissionController:
|
|
replicas: 1
|
|
---
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: ClusterProfile
|
|
metadata:
|
|
name: vault
|
|
spec:
|
|
syncMode: Continuous
|
|
helmCharts:
|
|
- repositoryURL: oci://registry-1.docker.io/bitnamicharts
|
|
repositoryName: oci-vault
|
|
chartName: vault
|
|
chartVersion: 0.7.2
|
|
- repositoryURL: oci://custom-registry:443/charts
|
|
repositoryName: oci-custom-vault
|
|
chartName: vault-sidecar
|
|
chartVersion: 0.5.0
|
|
`;
|
|
const result = extractPackageFile(
|
|
validClusterProfile,
|
|
'clusterprofiles.yml',
|
|
);
|
|
expect(result).toEqual({
|
|
deps: [
|
|
{
|
|
currentValue: '23.4.0',
|
|
datasource: 'helm',
|
|
depType: 'ClusterProfile',
|
|
depName: 'prometheus-community/prometheus',
|
|
packageName: 'prometheus',
|
|
registryUrls: [
|
|
'https://prometheus-community.github.io/helm-charts',
|
|
],
|
|
},
|
|
{
|
|
currentValue: 'v3.2.5',
|
|
datasource: 'helm',
|
|
depType: 'ClusterProfile',
|
|
depName: 'kyverno/kyverno',
|
|
packageName: 'kyverno',
|
|
registryUrls: ['https://kyverno.github.io/kyverno/'],
|
|
},
|
|
{
|
|
currentValue: 'v3.2.0',
|
|
datasource: 'helm',
|
|
depType: 'ClusterProfile',
|
|
depName: 'kyverno/kyverno-policies',
|
|
packageName: 'kyverno-policies',
|
|
registryUrls: ['https://kyverno.github.io/kyverno/'],
|
|
},
|
|
{
|
|
currentValue: '0.7.2',
|
|
datasource: 'docker',
|
|
depType: 'ClusterProfile',
|
|
depName: 'vault',
|
|
packageName: 'registry-1.docker.io/bitnamicharts/vault',
|
|
pinDigests: false,
|
|
},
|
|
{
|
|
currentValue: '0.5.0',
|
|
datasource: 'docker',
|
|
depType: 'ClusterProfile',
|
|
depName: 'vault-sidecar',
|
|
packageName: 'custom-registry:443/charts/vault-sidecar',
|
|
pinDigests: false,
|
|
},
|
|
],
|
|
});
|
|
});
|
|
|
|
it('considers registryAliases', () => {
|
|
const validClusterProfileOCI = codeBlock`
|
|
---
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: ClusterProfile
|
|
metadata:
|
|
name: vault
|
|
spec:
|
|
syncMode: Continuous
|
|
helmCharts:
|
|
- repositoryURL: oci://registry-1.docker.io/bitnamicharts
|
|
repositoryName: oci-vault
|
|
chartName: vault
|
|
chartVersion: 0.7.2
|
|
`;
|
|
const result = extractPackageFile(
|
|
validClusterProfileOCI,
|
|
'clusterprofiles.yml',
|
|
{
|
|
registryAliases: {
|
|
'registry-1.docker.io': 'docker.proxy.test/some/path',
|
|
},
|
|
},
|
|
);
|
|
expect(result).toEqual({
|
|
deps: [
|
|
{
|
|
currentValue: '0.7.2',
|
|
depName: 'vault',
|
|
packageName: 'docker.proxy.test/some/path/bitnamicharts/vault',
|
|
datasource: 'docker',
|
|
depType: 'ClusterProfile',
|
|
pinDigests: false,
|
|
},
|
|
],
|
|
});
|
|
});
|
|
|
|
it('supports clusterpromotions', () => {
|
|
const validClusterPromotion = codeBlock`
|
|
---
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: ClusterPromotion
|
|
metadata:
|
|
name: baseline
|
|
spec:
|
|
profileSpec:
|
|
helmCharts:
|
|
- repositoryURL: https://prometheus-community.github.io/helm-charts
|
|
repositoryName: prometheus-community
|
|
chartName: prometheus-community/prometheus
|
|
chartVersion: "23.4.0"
|
|
- repositoryURL: https://kyverno.github.io/kyverno/
|
|
repositoryName: kyverno
|
|
chartName: kyverno/kyverno
|
|
chartVersion: "v3.2.5"
|
|
---
|
|
apiVersion: config.projectsveltos.io/v1beta1
|
|
kind: ClusterPromotion
|
|
metadata:
|
|
name: vault
|
|
spec:
|
|
profileSpec:
|
|
helmCharts:
|
|
- repositoryURL: oci://registry-1.docker.io/bitnamicharts
|
|
repositoryName: oci-vault
|
|
chartName: vault
|
|
chartVersion: 0.7.2
|
|
`;
|
|
const result = extractPackageFile(
|
|
validClusterPromotion,
|
|
'clusterpromotions.yml',
|
|
);
|
|
expect(result).toEqual({
|
|
deps: [
|
|
{
|
|
currentValue: '23.4.0',
|
|
datasource: 'helm',
|
|
depType: 'ClusterPromotion',
|
|
depName: 'prometheus-community/prometheus',
|
|
packageName: 'prometheus',
|
|
registryUrls: [
|
|
'https://prometheus-community.github.io/helm-charts',
|
|
],
|
|
},
|
|
{
|
|
currentValue: 'v3.2.5',
|
|
datasource: 'helm',
|
|
depType: 'ClusterPromotion',
|
|
depName: 'kyverno/kyverno',
|
|
packageName: 'kyverno',
|
|
registryUrls: ['https://kyverno.github.io/kyverno/'],
|
|
},
|
|
{
|
|
currentValue: '0.7.2',
|
|
datasource: 'docker',
|
|
depType: 'ClusterPromotion',
|
|
depName: 'vault',
|
|
packageName: 'registry-1.docker.io/bitnamicharts/vault',
|
|
pinDigests: false,
|
|
},
|
|
],
|
|
});
|
|
});
|
|
|
|
it('supports eventtriggers', () => {
|
|
const validEventTrigger = codeBlock`
|
|
---
|
|
apiVersion: lib.projectsveltos.io/v1beta1
|
|
kind: EventTrigger
|
|
metadata:
|
|
name: baseline
|
|
spec:
|
|
helmCharts:
|
|
- repositoryURL: https://prometheus-community.github.io/helm-charts
|
|
repositoryName: prometheus-community
|
|
chartName: prometheus-community/prometheus
|
|
chartVersion: "23.4.0"
|
|
- repositoryURL: https://kyverno.github.io/kyverno/
|
|
repositoryName: kyverno
|
|
chartName: kyverno/kyverno
|
|
chartVersion: "v3.2.5"
|
|
---
|
|
apiVersion: lib.projectsveltos.io/v1beta1
|
|
kind: EventTrigger
|
|
metadata:
|
|
name: kyverno
|
|
spec:
|
|
helmCharts:
|
|
- repositoryURL: https://kyverno.github.io/kyverno/
|
|
repositoryName: kyverno
|
|
chartName: kyverno/kyverno-policies
|
|
chartVersion: v3.2.0
|
|
releaseName: kyverno-latest
|
|
releaseNamespace: kyverno
|
|
helmChartAction: Install
|
|
values: |
|
|
admissionController:
|
|
replicas: 1
|
|
---
|
|
apiVersion: lib.projectsveltos.io/v1beta1
|
|
kind: EventTrigger
|
|
metadata:
|
|
name: vault
|
|
spec:
|
|
syncMode: Continuous
|
|
helmCharts:
|
|
- repositoryURL: oci://registry-1.docker.io/bitnamicharts
|
|
repositoryName: oci-vault
|
|
chartName: vault
|
|
chartVersion: 0.7.2
|
|
- repositoryURL: oci://custom-registry:443/charts
|
|
repositoryName: oci-custom-vault
|
|
chartName: vault-sidecar
|
|
chartVersion: 0.5.0
|
|
`;
|
|
const result = extractPackageFile(validEventTrigger, 'eventtriggers.yml');
|
|
expect(result).toEqual({
|
|
deps: [
|
|
{
|
|
currentValue: '23.4.0',
|
|
datasource: 'helm',
|
|
depName: 'prometheus-community/prometheus',
|
|
packageName: 'prometheus',
|
|
depType: 'EventTrigger',
|
|
registryUrls: [
|
|
'https://prometheus-community.github.io/helm-charts',
|
|
],
|
|
},
|
|
{
|
|
currentValue: 'v3.2.5',
|
|
datasource: 'helm',
|
|
depName: 'kyverno/kyverno',
|
|
packageName: 'kyverno',
|
|
depType: 'EventTrigger',
|
|
registryUrls: ['https://kyverno.github.io/kyverno/'],
|
|
},
|
|
{
|
|
currentValue: 'v3.2.0',
|
|
datasource: 'helm',
|
|
depName: 'kyverno/kyverno-policies',
|
|
packageName: 'kyverno-policies',
|
|
depType: 'EventTrigger',
|
|
registryUrls: ['https://kyverno.github.io/kyverno/'],
|
|
},
|
|
{
|
|
currentValue: '0.7.2',
|
|
datasource: 'docker',
|
|
depType: 'EventTrigger',
|
|
depName: 'vault',
|
|
packageName: 'registry-1.docker.io/bitnamicharts/vault',
|
|
pinDigests: false,
|
|
},
|
|
{
|
|
currentValue: '0.5.0',
|
|
datasource: 'docker',
|
|
depType: 'EventTrigger',
|
|
depName: 'vault-sidecar',
|
|
packageName: 'custom-registry:443/charts/vault-sidecar',
|
|
pinDigests: false,
|
|
},
|
|
],
|
|
});
|
|
});
|
|
});
|
|
});
|