diff --git a/lib/datasource/terraform-module/index.ts b/lib/datasource/terraform-module/index.ts index ff8ccf9832da90..d096500a603a5c 100644 --- a/lib/datasource/terraform-module/index.ts +++ b/lib/datasource/terraform-module/index.ts @@ -50,6 +50,33 @@ export interface ServiceDiscoveryResult { 'providers.v1'?: string; } +export async function getTerraformServiceDiscoveryResult( + registryUrl: string +): Promise { + const discoveryURL = `${registryUrl}/.well-known/terraform.json`; + const cacheNamespace = 'terraform-service-discovery'; + const cachedResult = await packageCache.get( + cacheNamespace, + registryUrl + ); + // istanbul ignore if + if (cachedResult) { + return cachedResult; + } + const serviceDiscovery = ( + await http.getJson(discoveryURL) + ).body; + + const cacheMinutes = 1440; // 24h + await packageCache.set( + cacheNamespace, + registryUrl, + serviceDiscovery, + cacheMinutes + ); + + return serviceDiscovery; +} /** * terraform.getReleases * @@ -80,12 +107,9 @@ export async function getReleases({ return cachedResult; } try { - const serviceDiscovery = ( - await http.getJson( - `${registryUrl}/.well-known/terraform.json` - ) - ).body; - + const serviceDiscovery = await getTerraformServiceDiscoveryResult( + registryUrl + ); const pkgUrl = `${registry}${serviceDiscovery['modules.v1']}${repository}`; const res = (await http.getJson(pkgUrl)).body; const returnedName = res.namespace + '/' + res.name + '/' + res.provider; diff --git a/lib/datasource/terraform-provider/index.ts b/lib/datasource/terraform-provider/index.ts index 5b5fba1390aea4..f97a3608482243 100644 --- a/lib/datasource/terraform-provider/index.ts +++ b/lib/datasource/terraform-provider/index.ts @@ -3,7 +3,7 @@ import { logger } from '../../logger'; import * as packageCache from '../../util/cache/package'; import { Http } from '../../util/http'; import { GetReleasesConfig, ReleaseResult } from '../common'; -import { ServiceDiscoveryResult } from '../terraform-module'; +import { getTerraformServiceDiscoveryResult } from '../terraform-module'; export const id = 'terraform-provider'; export const defaultRegistryUrls = [ @@ -38,11 +38,9 @@ async function queryRegistry( registryURL: string, repository: string ): Promise { - const serviceDiscovery = ( - await http.getJson( - `${registryURL}/.well-known/terraform.json` - ) - ).body; + const serviceDiscovery = await getTerraformServiceDiscoveryResult( + registryURL + ); const backendURL = `${registryURL}${serviceDiscovery['providers.v1']}${repository}`; const res = (await http.getJson(backendURL)).body; const dep: ReleaseResult = {