Skip to content
Snippets Groups Projects
Commit 8ee4a68e authored by Rhys Arkins's avatar Rhys Arkins
Browse files

refactor: terraform registryUrls

parent 70dc1c42
No related branches found
No related tags found
No related merge requests found
...@@ -6,6 +6,27 @@ module.exports = { ...@@ -6,6 +6,27 @@ module.exports = {
getPkgReleases, getPkgReleases,
}; };
function getRegistryRepository(lookupName, registryUrls) {
let registry;
const split = lookupName.split('/');
if (split.length > 3 && split[0].includes('.')) {
[registry] = split;
split.shift();
} else if (is.nonEmptyArray(registryUrls)) {
[registry] = registryUrls;
} else {
registry = 'registry.terraform.io';
}
if (!registry.match('^https?://')) {
registry = `https://${registry}`;
}
const repository = split.join('/');
return {
registry,
repository,
};
}
/* /*
* terraform.getPkgReleases * terraform.getPkgReleases
* *
...@@ -15,13 +36,13 @@ module.exports = { ...@@ -15,13 +36,13 @@ module.exports = {
*/ */
async function getPkgReleases(purl, config) { async function getPkgReleases(purl, config) {
const { lookupName: dependency } = purl; const { registry, repository } = getRegistryRepository(
const registry = is.nonEmptyArray(config.repositoryUrls) purl.lookupName,
? config.repositoryUrls[0] config.registryUrls
: 'https://registry.terraform.io'; );
logger.debug({ dependency, registry }, 'terraform.getDependencies()'); logger.debug({ registry, repository }, 'terraform.getDependencies()');
const cacheNamespace = 'terraform'; const cacheNamespace = 'terraform';
const pkgUrl = `${registry}/v1/modules/${dependency}`; const pkgUrl = `${registry}/v1/modules/${repository}`;
const cachedResult = await renovateCache.get(cacheNamespace, pkgUrl); const cachedResult = await renovateCache.get(cacheNamespace, pkgUrl);
// istanbul ignore if // istanbul ignore if
if (cachedResult) { if (cachedResult) {
...@@ -33,13 +54,13 @@ async function getPkgReleases(purl, config) { ...@@ -33,13 +54,13 @@ async function getPkgReleases(purl, config) {
retry: 5, retry: 5,
})).body; })).body;
const returnedName = res.namespace + '/' + res.name + '/' + res.provider; const returnedName = res.namespace + '/' + res.name + '/' + res.provider;
if (returnedName !== dependency) { if (returnedName !== repository) {
logger.warn({ pkgUrl }, 'Terraform registry result mismatch'); logger.warn({ pkgUrl }, 'Terraform registry result mismatch');
return null; return null;
} }
// Simplify response before caching and returning // Simplify response before caching and returning
const dep = { const dep = {
name: dependency, name: repository,
versions: {}, versions: {},
}; };
if (res.source) { if (res.source) {
...@@ -49,7 +70,7 @@ async function getPkgReleases(purl, config) { ...@@ -49,7 +70,7 @@ async function getPkgReleases(purl, config) {
version, version,
})); }));
if (pkgUrl.startsWith('https://registry.terraform.io/')) { if (pkgUrl.startsWith('https://registry.terraform.io/')) {
dep.homepage = `https://registry.terraform.io/modules/${dependency}`; dep.homepage = `https://registry.terraform.io/modules/${repository}`;
} }
logger.trace({ dep }, 'dep'); logger.trace({ dep }, 'dep');
const cacheMinutes = 30; const cacheMinutes = 30;
...@@ -58,7 +79,7 @@ async function getPkgReleases(purl, config) { ...@@ -58,7 +79,7 @@ async function getPkgReleases(purl, config) {
} catch (err) { } catch (err) {
if (err.statusCode === 404 || err.code === 'ENOTFOUND') { if (err.statusCode === 404 || err.code === 'ENOTFOUND') {
logger.info( logger.info(
{ dependency }, { dependency: purl.lookupName },
`Terraform registry lookup failure: not found` `Terraform registry lookup failure: not found`
); );
logger.debug({ logger.debug({
...@@ -67,7 +88,7 @@ async function getPkgReleases(purl, config) { ...@@ -67,7 +88,7 @@ async function getPkgReleases(purl, config) {
return null; return null;
} }
logger.warn( logger.warn(
{ err, dependency }, { err, dependency: purl.lookupName },
'Terraform registry failure: Unknown error' 'Terraform registry failure: Unknown error'
); );
return null; return null;
......
...@@ -63,19 +63,12 @@ function extractPackageFile(content) { ...@@ -63,19 +63,12 @@ function extractPackageFile(content) {
const moduleParts = dep.source.split('//')[0].split('/'); const moduleParts = dep.source.split('//')[0].split('/');
if (moduleParts[0] === '..') { if (moduleParts[0] === '..') {
dep.skipReason = 'local'; dep.skipReason = 'local';
} else if (moduleParts.length === 3) { } else if (moduleParts.length >= 3) {
dep.depType = 'terraform'; dep.depType = 'terraform';
dep.depName = moduleParts.join('/'); dep.depName = moduleParts.join('/');
dep.depNameShort = dep.depName; dep.depNameShort = dep.depName;
dep.lineNumber = dep.versionLine; dep.lineNumber = dep.versionLine;
dep.purl = 'pkg:terraform/' + dep.depName; dep.purl = 'pkg:terraform/' + dep.depName;
} else if (moduleParts.length === 4) {
dep.depType = 'terraform';
dep.registryUrls = ['https://' + moduleParts.shift()];
dep.depName = moduleParts.join('/');
dep.depNameShort = dep.depName;
dep.lineNumber = dep.versionLine;
dep.purl = 'pkg:terraform/' + dep.depName;
} }
if (dep.lineNumber) { if (dep.lineNumber) {
if (!isValid(dep.currentValue)) { if (!isValid(dep.currentValue)) {
......
...@@ -79,3 +79,83 @@ Object { ...@@ -79,3 +79,83 @@ Object {
"versions": Object {}, "versions": Object {},
} }
`; `;
exports[`datasource/terraform getPkgReleases processes with registry in name 1`] = `
Object {
"homepage": "https://registry.terraform.io/modules/hashicorp/consul/aws",
"name": "hashicorp/consul/aws",
"releases": Array [
Object {
"version": "0.0.1",
},
Object {
"version": "0.0.2",
},
Object {
"version": "0.0.3",
},
Object {
"version": "0.0.4",
},
Object {
"version": "0.0.5",
},
Object {
"version": "0.1.0",
},
Object {
"version": "0.1.1",
},
Object {
"version": "0.1.2",
},
Object {
"version": "0.2.0",
},
Object {
"version": "0.2.1",
},
Object {
"version": "0.2.2",
},
Object {
"version": "0.3.0",
},
Object {
"version": "0.3.1",
},
Object {
"version": "0.3.2",
},
Object {
"version": "0.3.3",
},
Object {
"version": "0.3.4",
},
Object {
"version": "0.3.5",
},
Object {
"version": "0.3.6",
},
Object {
"version": "0.3.7",
},
Object {
"version": "0.3.8",
},
Object {
"version": "0.3.9",
},
Object {
"version": "0.3.10",
},
Object {
"version": "0.4.0",
},
],
"sourceUrl": "https://github.com/hashicorp/terraform-aws-consul",
"versions": Object {},
}
`;
...@@ -55,17 +55,24 @@ describe('datasource/terraform', () => { ...@@ -55,17 +55,24 @@ describe('datasource/terraform', () => {
expect(res).toMatchSnapshot(); expect(res).toMatchSnapshot();
expect(res).not.toBeNull(); expect(res).not.toBeNull();
}); });
it('processes with registry in name', async () => {
got.mockReturnValueOnce({
body: JSON.parse(consulData),
});
const res = await datasource.getPkgReleases({
purl: 'pkg:terraform/registry.terraform.io/hashicorp/consul/aws',
});
expect(res).toMatchSnapshot();
expect(res).not.toBeNull();
});
it('rejects mismatch', async () => { it('rejects mismatch', async () => {
got.mockReturnValueOnce({ got.mockReturnValueOnce({
body: JSON.parse(consulData), body: JSON.parse(consulData),
}); });
const config = { registryUrls: 'https://terraform.company.com' }; const res = await datasource.getPkgReleases({
const res = await datasource.getPkgReleases(
{
purl: 'pkg:terraform/consul/foo', purl: 'pkg:terraform/consul/foo',
}, registryUrls: ['https://terraform.company.com'],
config });
);
expect(res).toBeNull(); expect(res).toBeNull();
}); });
}); });
......
...@@ -86,41 +86,32 @@ Object { ...@@ -86,41 +86,32 @@ Object {
}, },
Object { Object {
"currentValue": "~> 1.1.0", "currentValue": "~> 1.1.0",
"depName": "example-corp/k8s-cluster/azurerm", "depName": "app.terraform.io/example-corp/k8s-cluster/azurerm",
"depNameShort": "example-corp/k8s-cluster/azurerm", "depNameShort": "app.terraform.io/example-corp/k8s-cluster/azurerm",
"depType": "terraform", "depType": "terraform",
"lineNumber": 71, "lineNumber": 71,
"moduleName": "consul", "moduleName": "consul",
"purl": "pkg:terraform/example-corp/k8s-cluster/azurerm", "purl": "pkg:terraform/app.terraform.io/example-corp/k8s-cluster/azurerm",
"registryUrls": Array [
"https://app.terraform.io",
],
"source": "app.terraform.io/example-corp/k8s-cluster/azurerm", "source": "app.terraform.io/example-corp/k8s-cluster/azurerm",
}, },
Object { Object {
"currentValue": "~> 1.1", "currentValue": "~> 1.1",
"depName": "example-corp/k8s-cluster/azurerm", "depName": "app.terraform.io/example-corp/k8s-cluster/azurerm",
"depNameShort": "example-corp/k8s-cluster/azurerm", "depNameShort": "app.terraform.io/example-corp/k8s-cluster/azurerm",
"depType": "terraform", "depType": "terraform",
"lineNumber": 76, "lineNumber": 76,
"moduleName": "consul2", "moduleName": "consul2",
"purl": "pkg:terraform/example-corp/k8s-cluster/azurerm", "purl": "pkg:terraform/app.terraform.io/example-corp/k8s-cluster/azurerm",
"registryUrls": Array [
"https://app.terraform.io",
],
"source": "app.terraform.io/example-corp/k8s-cluster/azurerm", "source": "app.terraform.io/example-corp/k8s-cluster/azurerm",
}, },
Object { Object {
"currentValue": "~~ 1.1", "currentValue": "~~ 1.1",
"depName": "example-corp/k8s-cluster/azurerm", "depName": "app.terraform.io/example-corp/k8s-cluster/azurerm",
"depNameShort": "example-corp/k8s-cluster/azurerm", "depNameShort": "app.terraform.io/example-corp/k8s-cluster/azurerm",
"depType": "terraform", "depType": "terraform",
"lineNumber": 81, "lineNumber": 81,
"moduleName": "consul3", "moduleName": "consul3",
"purl": "pkg:terraform/example-corp/k8s-cluster/azurerm", "purl": "pkg:terraform/app.terraform.io/example-corp/k8s-cluster/azurerm",
"registryUrls": Array [
"https://app.terraform.io",
],
"skipReason": "unsupported-version", "skipReason": "unsupported-version",
"source": "app.terraform.io/example-corp/k8s-cluster/azurerm", "source": "app.terraform.io/example-corp/k8s-cluster/azurerm",
}, },
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment