Skip to content

Commit

Permalink
feat(Terraform): renovate required terraform version (#8791)
Browse files Browse the repository at this point in the history
  • Loading branch information
secustor committed Feb 21, 2021
1 parent 8c48d4b commit 5a02743
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 1 deletion.
7 changes: 7 additions & 0 deletions lib/manager/terraform/__snapshots__/extract.spec.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,13 @@ Object {
"depName": "azurerm",
"depType": "terraform",
},
Object {
"currentValue": ">= 0.13",
"datasource": "github-tags",
"depName": "hashicorp/terraform",
"extractVersion": "v(?<version>.*)$",
"lineNumber": 205,
},
Object {
"currentValue": "2.7.2",
"datasource": "terraform-provider",
Expand Down
2 changes: 1 addition & 1 deletion lib/manager/terraform/extract.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ describe('lib/manager/terraform/extract', () => {
it('extracts', () => {
const res = extractPackageFile(tf1);
expect(res).toMatchSnapshot();
expect(res.deps).toHaveLength(44);
expect(res.deps).toHaveLength(45);
expect(res.deps.filter((dep) => dep.skipReason)).toHaveLength(8);
});
it('returns null if only local deps', () => {
Expand Down
11 changes: 11 additions & 0 deletions lib/manager/terraform/extract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ import {
extractTerraformProvider,
} from './providers';
import { extractTerraformRequiredProviders } from './required-providers';
import {
analyseTerraformVersion,
extractTerraformRequiredVersion,
} from './required-version';
import {
analyseTerraformResource,
extractTerraformResource,
Expand Down Expand Up @@ -70,6 +74,10 @@ export function extractPackageFile(content: string): PackageFile | null {
result = extractTerraformResource(lineNumber, lines);
break;
}
case TerraformDependencyTypes.terraform_version: {
result = extractTerraformRequiredVersion(lineNumber, lines);
break;
}
/* istanbul ignore next */
default:
logger.trace(
Expand Down Expand Up @@ -99,6 +107,9 @@ export function extractPackageFile(content: string): PackageFile | null {
case TerraformDependencyTypes.resource:
analyseTerraformResource(dep);
break;
case TerraformDependencyTypes.terraform_version:
analyseTerraformVersion(dep);
break;
/* istanbul ignore next */
default:
}
Expand Down
55 changes: 55 additions & 0 deletions lib/manager/terraform/required-version.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import * as datasourceGithubTags from '../../datasource/github-tags';
import { logger } from '../../logger';
import { PackageDependency } from '../common';
import {
ExtractionResult,
TerraformDependencyTypes,
keyValueExtractionRegex,
} from './util';

export function extractTerraformRequiredVersion(
startingLine: number,
lines: string[]
): ExtractionResult {
const deps: PackageDependency[] = [];
let lineNumber = startingLine;
let braceCounter = 0;
do {
// istanbul ignore if
if (lineNumber > lines.length - 1) {
logger.debug(`Malformed Terraform file detected.`);
}

const line = lines[lineNumber];
// `{` will be counted wit +1 and `}` with -1. Therefore if we reach braceCounter == 0. We have found the end of the terraform block
const openBrackets = (line.match(/\{/g) || []).length;
const closedBrackets = (line.match(/\}/g) || []).length;
braceCounter = braceCounter + openBrackets - closedBrackets;

const kvMatch = keyValueExtractionRegex.exec(line);
if (kvMatch && kvMatch.groups.key === 'required_version') {
const dep: PackageDependency = {
currentValue: kvMatch.groups.value,
lineNumber,
managerData: {
terraformDependencyType: TerraformDependencyTypes.terraform_version,
},
};
deps.push(dep);
// returning starting line as required_providers are also in the terraform block
// if we would return the position of the required_version line we would potentially skip the providers
return { lineNumber: startingLine, dependencies: deps };
}

lineNumber += 1;
} while (braceCounter !== 0);
return null;
}

export function analyseTerraformVersion(dep: PackageDependency): void {
/* eslint-disable no-param-reassign */
dep.datasource = datasourceGithubTags.id;
dep.depName = 'hashicorp/terraform';
dep.extractVersion = 'v(?<version>.*)$';
/* eslint-enable no-param-reassign */
}
4 changes: 4 additions & 0 deletions lib/manager/terraform/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export enum TerraformDependencyTypes {
provider = 'provider',
required_providers = 'required_providers',
resource = 'resource',
terraform_version = 'terraform_version',
}

export interface TerraformManagerData {
Expand Down Expand Up @@ -64,6 +65,9 @@ export function getTerraformDependencyType(
case 'resource': {
return TerraformDependencyTypes.resource;
}
case 'terraform': {
return TerraformDependencyTypes.terraform_version;
}
default: {
return TerraformDependencyTypes.unknown;
}
Expand Down

0 comments on commit 5a02743

Please sign in to comment.