From 7066a5dd99cec6e873abe8042a24b0dcbb0b6e22 Mon Sep 17 00:00:00 2001 From: Rhys Arkins <rhys@arkins.net> Date: Sat, 21 Jul 2018 10:47:29 +0200 Subject: [PATCH] fix(docker): use tag suffix when looking up new digest --- lib/datasource/docker.js | 38 ++++++++++++++----- lib/datasource/index.js | 10 ++--- .../repository/process/lookup/index.js | 2 +- test/datasource/docker.spec.js | 20 ++++++++-- test/datasource/index.spec.js | 4 +- 5 files changed, 52 insertions(+), 22 deletions(-) diff --git a/lib/datasource/docker.js b/lib/datasource/docker.js index a6324262e5..8662f3000f 100644 --- a/lib/datasource/docker.js +++ b/lib/datasource/docker.js @@ -58,12 +58,17 @@ async function getAuthHeaders(registry, repository) { } } -async function getDigest(registry, name, tag = 'latest') { - logger.debug(`getDigest(${registry}, ${name}, ${tag})`); - const massagedRegistry = massageRegistry(registry); - const repository = getRepository(name); +async function getDigest(config, newValue) { + const { dockerRegistry, depName, tagSuffix } = config; + logger.debug(`getDigest(${dockerRegistry}, ${depName}, ${newValue})`); + const massagedRegistry = massageRegistry(dockerRegistry); + const repository = getRepository(depName); + let newTag = newValue; + if (tagSuffix) { + newTag += `-${tagSuffix}`; + } try { - const url = `${massagedRegistry}/v2/${repository}/manifests/${tag}`; + const url = `${massagedRegistry}/v2/${repository}/manifests/${newTag}`; const headers = await getAuthHeaders(massagedRegistry, repository); if (!headers) { logger.info('No docker auth found - returning'); @@ -79,7 +84,7 @@ async function getDigest(registry, name, tag = 'latest') { throw err; } if (err.statusCode === 401) { - logger.info({ registry, repository }, 'Unauthorized docker lookup'); + logger.info({ dockerRegistry, repository }, 'Unauthorized docker lookup'); logger.debug({ err, message: err.message, @@ -89,14 +94,24 @@ async function getDigest(registry, name, tag = 'latest') { } if (err.statusCode === 404) { logger.info( - { err, body: err.response ? err.response.body : undefined, name, tag }, + { + err, + body: err.response ? err.response.body : undefined, + depName, + newTag, + }, 'Docker Manifest is unknown' ); return null; } if (err.statusCode >= 500 && err.statusCode < 600) { logger.warn( - { err, body: err.response ? err.response.body : undefined, name, tag }, + { + err, + body: err.response ? err.response.body : undefined, + depName, + newTag, + }, 'docker registry failure: internal error' ); throw new Error('registry-failure'); @@ -110,7 +125,12 @@ async function getDigest(registry, name, tag = 'latest') { return null; } logger.info( - { err, body: err.response ? err.response.body : undefined, name, tag }, + { + err, + body: err.response ? err.response.body : undefined, + depName, + newTag, + }, 'Unknown Error looking up docker image digest' ); return null; diff --git a/lib/datasource/index.js b/lib/datasource/index.js index 0eeb0c7c79..46a29840dd 100644 --- a/lib/datasource/index.js +++ b/lib/datasource/index.js @@ -33,13 +33,9 @@ function supportsDigests(purlStr) { return !!datasources[purl.type].getDependency; } -function getDigest(purlStr, value) { - const purl = parse(purlStr); - return datasources[purl.type].getDigest( - purl.qualifiers.registry, - purl.fullname, - value - ); +function getDigest(config, value) { + const purl = parse(config.purl); + return datasources[purl.type].getDigest(config, value); } module.exports = { diff --git a/lib/workers/repository/process/lookup/index.js b/lib/workers/repository/process/lookup/index.js index 3664366295..2997eb3ef8 100644 --- a/lib/workers/repository/process/lookup/index.js +++ b/lib/workers/repository/process/lookup/index.js @@ -175,7 +175,7 @@ async function lookupUpdates(config) { // update digest for all for (const update of res.updates) { if (config.pinDigests || config.currentDigest) { - update.newDigest = await getDigest(config.purl, update.newValue); + update.newDigest = await getDigest(config, update.newValue); if (update.newDigest) { update.newDigestShort = update.newDigest.slice(7, 13); } else { diff --git a/test/datasource/docker.spec.js b/test/datasource/docker.spec.js index 1527f62f93..b0aec92106 100644 --- a/test/datasource/docker.spec.js +++ b/test/datasource/docker.spec.js @@ -10,12 +10,18 @@ describe('api/docker', () => { }); it('returns null if no token', async () => { got.mockReturnValueOnce({ body: {} }); - const res = await docker.getDigest(undefined, 'some-name', undefined); + const res = await docker.getDigest( + { depName: 'some-dep' }, + 'some-new-value' + ); expect(res).toBe(null); }); it('returns null if errored', async () => { got.mockReturnValueOnce({ body: { token: 'some-token' } }); - const res = await docker.getDigest(undefined, 'some-name', undefined); + const res = await docker.getDigest( + { depName: 'some-dep' }, + 'some-new-value' + ); expect(res).toBe(null); }); it('returns digest', async () => { @@ -23,7 +29,10 @@ describe('api/docker', () => { got.mockReturnValueOnce({ headers: { 'docker-content-digest': 'some-digest' }, }); - const res = await docker.getDigest(undefined, 'some-name', undefined); + const res = await docker.getDigest( + { depName: 'some-dep' }, + 'some-new-value' + ); expect(res).toBe('some-digest'); }); it('supports scoped names', async () => { @@ -31,7 +40,10 @@ describe('api/docker', () => { got.mockReturnValueOnce({ headers: { 'docker-content-digest': 'some-digest' }, }); - const res = await docker.getDigest(undefined, 'some/name', undefined); + const res = await docker.getDigest( + { depName: 'some-dep', tagSuffix: 'alpine' }, + '8.0.0' + ); expect(res).toBe('some-digest'); }); }); diff --git a/test/datasource/index.spec.js b/test/datasource/index.spec.js index d560bd284b..1d896742f4 100644 --- a/test/datasource/index.spec.js +++ b/test/datasource/index.spec.js @@ -7,6 +7,8 @@ describe('datasource/index', () => { expect(await datasource.getDependency('pkggithub/some/dep')).toBeNull(); }); it('returns getDigest', async () => { - expect(await datasource.getDigest('pkg:docker/node')).toBeUndefined(); + expect( + await datasource.getDigest({ purl: 'pkg:docker/node' }) + ).toBeUndefined(); }); }); -- GitLab