From a8c8c00be0512d717f204aa6d3379b274502a2a6 Mon Sep 17 00:00:00 2001 From: Michael Kriese Date: Thu, 25 May 2023 14:40:30 +0200 Subject: [PATCH] feat(manager/terraform): search lockfile on parent dirs (#22403) --- lib/modules/manager/terraform/extract.spec.ts | 2 +- .../manager/terraform/lockfile/index.spec.ts | 38 ++++++++++++++----- .../manager/terraform/lockfile/index.ts | 8 +++- .../manager/terraform/lockfile/util.ts | 6 +-- lib/modules/manager/terraform/util.ts | 2 +- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/lib/modules/manager/terraform/extract.spec.ts b/lib/modules/manager/terraform/extract.spec.ts index 0cd851c567fbae..d407b781d2077f 100644 --- a/lib/modules/manager/terraform/extract.spec.ts +++ b/lib/modules/manager/terraform/extract.spec.ts @@ -655,7 +655,7 @@ describe('modules/manager/terraform/extract', () => { it('update lockfile constraints with range strategy update-lockfile', async () => { fs.readLocalFile.mockResolvedValueOnce(lockedVersionLockfile); - fs.getSiblingFileName.mockReturnValueOnce('aLockFile.hcl'); + fs.findLocalSiblingOrParent.mockResolvedValueOnce('aLockFile.hcl'); const res = await extractPackageFile( lockedVersion, diff --git a/lib/modules/manager/terraform/lockfile/index.spec.ts b/lib/modules/manager/terraform/lockfile/index.spec.ts index 5294f00725c51c..354b84fd4fdd82 100644 --- a/lib/modules/manager/terraform/lockfile/index.spec.ts +++ b/lib/modules/manager/terraform/lockfile/index.spec.ts @@ -39,7 +39,19 @@ describe('modules/manager/terraform/lockfile/index', () => { }); it('returns null if no .terraform.lock.hcl found', async () => { + expect( + await updateArtifacts({ + packageFileName: 'main.tf', + updatedDeps: [{ depName: 'aws' }], + newPackageFileContent: '', + config, + }) + ).toBeNull(); + }); + + it('returns null if .terraform.lock.hcl is empty', async () => { fs.readLocalFile.mockResolvedValueOnce(''); + fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl'); expect( await updateArtifacts({ @@ -51,8 +63,9 @@ describe('modules/manager/terraform/lockfile/index', () => { ).toBeNull(); }); - it('returns null if .terraform.lock.hcl is empty', async () => { + it('returns null if .terraform.lock.hcl is invalid', async () => { fs.readLocalFile.mockResolvedValueOnce('empty'); + fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl'); expect( await updateArtifacts({ @@ -66,7 +79,7 @@ describe('modules/manager/terraform/lockfile/index', () => { it('update single dependency with exact constraint and depType provider', async () => { fs.readLocalFile.mockResolvedValueOnce(validLockfile); - fs.getSiblingFileName.mockReturnValueOnce('.terraform.lock.hcl'); + fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl'); mockHash.mockResolvedValueOnce([ 'h1:lDsKRxDRXPEzA4AxkK4t+lJd3IQIP2UoaplJGjQSp2s=', @@ -101,7 +114,7 @@ describe('modules/manager/terraform/lockfile/index', () => { it('update single dependency with exact constraint and and depType required_provider', async () => { fs.readLocalFile.mockResolvedValueOnce(validLockfile); - fs.getSiblingFileName.mockReturnValueOnce('.terraform.lock.hcl'); + fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl'); mockHash.mockResolvedValueOnce([ 'h1:lDsKRxDRXPEzA4AxkK4t+lJd3IQIP2UoaplJGjQSp2s=', @@ -154,7 +167,7 @@ describe('modules/manager/terraform/lockfile/index', () => { it('update single dependency with range constraint and minor update from private registry', async () => { fs.readLocalFile.mockResolvedValueOnce(validLockfile); - fs.getSiblingFileName.mockReturnValueOnce('.terraform.lock.hcl'); + fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl'); mockHash.mockResolvedValueOnce([ 'h1:lDsKRxDRXPEzA4AxkK4t+lJd3IQIP2UoaplJGjQSp2s=', @@ -190,7 +203,7 @@ describe('modules/manager/terraform/lockfile/index', () => { it('update single dependency with range constraint and major update', async () => { fs.readLocalFile.mockResolvedValueOnce(validLockfile); - fs.getSiblingFileName.mockReturnValueOnce('.terraform.lock.hcl'); + fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl'); mockHash.mockResolvedValueOnce([ 'h1:lDsKRxDRXPEzA4AxkK4t+lJd3IQIP2UoaplJGjQSp2s=', @@ -225,7 +238,9 @@ describe('modules/manager/terraform/lockfile/index', () => { it('update single dependency in subfolder', async () => { fs.readLocalFile.mockResolvedValueOnce(validLockfile); - fs.getSiblingFileName.mockReturnValueOnce('test/.terraform.lock.hcl'); + fs.findLocalSiblingOrParent.mockResolvedValueOnce( + 'test/.terraform.lock.hcl' + ); mockHash.mockResolvedValueOnce([ 'h1:lDsKRxDRXPEzA4AxkK4t+lJd3IQIP2UoaplJGjQSp2s=', @@ -260,7 +275,9 @@ describe('modules/manager/terraform/lockfile/index', () => { it('update multiple dependencies which are not ordered', async () => { fs.readLocalFile.mockResolvedValue(validLockfile2); - fs.getSiblingFileName.mockReturnValue('test/.terraform.lock.hcl'); + fs.findLocalSiblingOrParent.mockResolvedValueOnce( + 'test/.terraform.lock.hcl' + ); mockHash.mockResolvedValue([ 'h1:lDsKRxDRXPEzA4AxkK4t+lJd3IQIP2UoaplJGjQSp2s=', @@ -316,7 +333,7 @@ describe('modules/manager/terraform/lockfile/index', () => { it('do full lock file maintenance', async () => { fs.readLocalFile.mockResolvedValueOnce(validLockfile); - fs.getSiblingFileName.mockReturnValueOnce('.terraform.lock.hcl'); + fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl'); mockGetPkgReleases .mockResolvedValueOnce({ @@ -389,7 +406,9 @@ describe('modules/manager/terraform/lockfile/index', () => { it('do full lock file maintenance with lockfile in subfolder', async () => { fs.readLocalFile.mockResolvedValueOnce(validLockfile); - fs.getSiblingFileName.mockReturnValueOnce('subfolder/.terraform.lock.hcl'); + fs.findLocalSiblingOrParent.mockResolvedValueOnce( + 'subfolder/.terraform.lock.hcl' + ); mockGetPkgReleases .mockResolvedValueOnce({ @@ -519,6 +538,7 @@ describe('modules/manager/terraform/lockfile/index', () => { it('return null if hashing fails', async () => { fs.readLocalFile.mockResolvedValueOnce(validLockfile); + fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl'); mockGetPkgReleases .mockResolvedValueOnce({ diff --git a/lib/modules/manager/terraform/lockfile/index.ts b/lib/modules/manager/terraform/lockfile/index.ts index d4421c3d41310a..e036638d2621b6 100644 --- a/lib/modules/manager/terraform/lockfile/index.ts +++ b/lib/modules/manager/terraform/lockfile/index.ts @@ -69,7 +69,13 @@ export async function updateArtifacts({ }: UpdateArtifact): Promise { logger.debug(`terraform.updateArtifacts(${packageFileName})`); - const lockFilePath = findLockFile(packageFileName); + const lockFilePath = await findLockFile(packageFileName); + + if (!lockFilePath) { + logger.debug('No .terraform.lock.hcl found'); + return null; + } + try { const lockFileContent = await readLockFile(lockFilePath); if (!lockFileContent) { diff --git a/lib/modules/manager/terraform/lockfile/util.ts b/lib/modules/manager/terraform/lockfile/util.ts index 2f59bb1e566722..22c78f1bb773d9 100644 --- a/lib/modules/manager/terraform/lockfile/util.ts +++ b/lib/modules/manager/terraform/lockfile/util.ts @@ -1,4 +1,4 @@ -import { getSiblingFileName, readLocalFile } from '../../../../util/fs'; +import { findLocalSiblingOrParent, readLocalFile } from '../../../../util/fs'; import { newlineRegex, regEx } from '../../../../util/regex'; import { get as getVersioning } from '../../../versioning'; import type { UpdateArtifactsResult } from '../../types'; @@ -22,8 +22,8 @@ const hashLineRegex = regEx(`^(?\\s*")(?[^"]+)(?",.*)$`); const lockFile = '.terraform.lock.hcl'; -export function findLockFile(packageFilePath: string): string { - return getSiblingFileName(packageFilePath, lockFile); +export function findLockFile(packageFilePath: string): Promise { + return findLocalSiblingOrParent(packageFilePath, lockFile); } export function readLockFile(lockFilePath: string): Promise { diff --git a/lib/modules/manager/terraform/util.ts b/lib/modules/manager/terraform/util.ts index b20fd368121e94..a1644e3057217c 100644 --- a/lib/modules/manager/terraform/util.ts +++ b/lib/modules/manager/terraform/util.ts @@ -55,7 +55,7 @@ export async function extractLocksForPackageFile( fileName: string ): Promise { const locks: ProviderLock[] = []; - const lockFilePath = findLockFile(fileName); + const lockFilePath = await findLockFile(fileName); if (lockFilePath) { const lockFileContent = await readLockFile(lockFilePath); if (lockFileContent) {