Skip to content

Commit 6ba08ec

Browse files
feat(terraform): add support for docker_registry_image data source (renovatebot#35537)
Co-authored-by: Rhys Arkins <rhys@arkins.net>
1 parent 53cdf3f commit 6ba08ec

File tree

6 files changed

+52
-7
lines changed

6 files changed

+52
-7
lines changed

lib/modules/manager/terraform/__fixtures__/docker.tf

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# docker_registry_image data source
2+
data "docker_registry_image" "ubuntu" {
3+
name = "ubuntu:precise"
4+
}
5+
16
# docker_image resources
27
# https://registry.terraform.io/providers/kreuzwerker/docker/latest/docs/resources/image
38
resource "docker_image" "nginx" {
@@ -8,7 +13,7 @@ resource "docker_image" "invalid" {
813
}
914

1015
resource "docker_image" "ignore_variable" {
11-
name = "${data.docker_registry_image.ubuntu.name}"
16+
name = data.docker_registry_image.ubuntu.name
1217
pull_triggers = ["${data.docker_registry_image.ubuntu.sha256_digest}"]
1318
}
1419

lib/modules/manager/terraform/extract.spec.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ describe('modules/manager/terraform/extract', () => {
455455
const res = await extractPackageFile(docker, 'docker.tf', {
456456
registryAliases: { 'hub.proxy.test': 'index.docker.io' },
457457
});
458-
expect(res?.deps).toHaveLength(7);
458+
expect(res?.deps).toHaveLength(8);
459459
expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(3);
460460
expect(res?.deps).toMatchObject([
461461
{
@@ -512,6 +512,18 @@ describe('modules/manager/terraform/extract', () => {
512512
depType: 'docker_service',
513513
replaceString: 'repo.mycompany.com:8080/foo-service:v1',
514514
},
515+
{
516+
autoReplaceStringTemplate:
517+
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',
518+
currentDigest: undefined,
519+
currentValue: 'precise',
520+
datasource: 'docker',
521+
depName: 'ubuntu',
522+
depType: 'docker_registry_image',
523+
packageName: 'ubuntu',
524+
replaceString: 'ubuntu:precise',
525+
versioning: 'ubuntu',
526+
},
515527
]);
516528
});
517529

lib/modules/manager/terraform/extractors/resources/generic-docker-image-ref.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import type { ExtractConfig, PackageDependency } from '../../../types';
44
import { DependencyExtractor } from '../../base';
55
import type { TerraformDefinitionFile } from '../../hcl/types';
66
import type { ProviderLock } from '../../lockfile/types';
7-
import { generic_image_resource } from './utils';
7+
import type { GenericImageResourceDef } from '../../types';
8+
import { generic_image_datasource, generic_image_resource } from './utils';
89

910
export class GenericDockerImageRefExtractor extends DependencyExtractor {
1011
getCheckList(): string[] {
@@ -16,16 +17,33 @@ export class GenericDockerImageRefExtractor extends DependencyExtractor {
1617
_locks: ProviderLock[],
1718
config: ExtractConfig,
1819
): PackageDependency[] {
19-
const resourceTypMap = hclMap.resource;
20-
if (is.nullOrUndefined(resourceTypMap)) {
20+
const dependencies = [];
21+
22+
dependencies.push(
23+
...this.extractResources(hclMap.resource, generic_image_resource, config),
24+
);
25+
26+
dependencies.push(
27+
...this.extractResources(hclMap.data, generic_image_datasource, config),
28+
);
29+
30+
return dependencies;
31+
}
32+
33+
private extractResources(
34+
typeMap: Record<string, unknown> | undefined,
35+
image_definitions: GenericImageResourceDef[],
36+
config: ExtractConfig,
37+
): PackageDependency[] {
38+
if (is.nullOrUndefined(typeMap)) {
2139
return [];
2240
}
2341

2442
const dependencies = [];
2543

26-
for (const image_resource_def of generic_image_resource) {
44+
for (const image_resource_def of image_definitions) {
2745
const { type, path } = image_resource_def;
28-
const resourceInstancesMap = resourceTypMap[type];
46+
const resourceInstancesMap = typeMap[type];
2947
// is there a resource with current looked at type ( `image_resource_def` )
3048
if (!is.nonEmptyObject(resourceInstancesMap)) {
3149
continue;
@@ -38,6 +56,7 @@ export class GenericDockerImageRefExtractor extends DependencyExtractor {
3856
);
3957
}
4058
}
59+
4160
return dependencies;
4261
}
4362

lib/modules/manager/terraform/extractors/resources/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ const KubernetesJobTemplateInit = [
3535
'image',
3636
];
3737

38+
export const generic_image_datasource: GenericImageResourceDef[] = [
39+
{ type: 'docker_registry_image', path: ['name'] },
40+
];
41+
3842
export const generic_image_resource: GenericImageResourceDef[] = [
3943
// Docker provider: https://registry.terraform.io/providers/kreuzwerker/docker
4044
{ type: 'docker_image', path: ['name'] },

lib/modules/manager/terraform/hcl/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export interface TerraformDefinitionFile {
22
terraform?: TerraformBlock[];
33
module?: Record<string, TerraformModule[]>;
44
resource?: TerraformResources;
5+
data?: Record<string, unknown>; // generic docker data sources
56
provider?: Record<string, TerraformProvider[]>;
67
}
78

lib/modules/manager/terraform/readme.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,8 @@ You can use these `depTypes` for fine-grained control, for example to disable pa
120120
| Kubernetes StatefulSet | `kubernetes_stateful_set` | |
121121
| Kubernetes StatefulSet v1 | `kubernetes_stateful_set_v1` | |
122122

123+
| Data Source | `depType` | Notes |
124+
| --------------------- | :---------------------: | :---: |
125+
| Docker registry image | `docker_registry_image` | |
126+
123127
If you need to change the versioning format, read the [versioning](../../versioning/index.md) documentation to learn more.

0 commit comments

Comments
 (0)