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

fix(docker): use tag suffix when looking up new digest

parent afdaa1ae
Branches
Tags 13.25.8
No related merge requests found
...@@ -58,12 +58,17 @@ async function getAuthHeaders(registry, repository) { ...@@ -58,12 +58,17 @@ async function getAuthHeaders(registry, repository) {
} }
} }
async function getDigest(registry, name, tag = 'latest') { async function getDigest(config, newValue) {
logger.debug(`getDigest(${registry}, ${name}, ${tag})`); const { dockerRegistry, depName, tagSuffix } = config;
const massagedRegistry = massageRegistry(registry); logger.debug(`getDigest(${dockerRegistry}, ${depName}, ${newValue})`);
const repository = getRepository(name); const massagedRegistry = massageRegistry(dockerRegistry);
const repository = getRepository(depName);
let newTag = newValue;
if (tagSuffix) {
newTag += `-${tagSuffix}`;
}
try { try {
const url = `${massagedRegistry}/v2/${repository}/manifests/${tag}`; const url = `${massagedRegistry}/v2/${repository}/manifests/${newTag}`;
const headers = await getAuthHeaders(massagedRegistry, repository); const headers = await getAuthHeaders(massagedRegistry, repository);
if (!headers) { if (!headers) {
logger.info('No docker auth found - returning'); logger.info('No docker auth found - returning');
...@@ -79,7 +84,7 @@ async function getDigest(registry, name, tag = 'latest') { ...@@ -79,7 +84,7 @@ async function getDigest(registry, name, tag = 'latest') {
throw err; throw err;
} }
if (err.statusCode === 401) { if (err.statusCode === 401) {
logger.info({ registry, repository }, 'Unauthorized docker lookup'); logger.info({ dockerRegistry, repository }, 'Unauthorized docker lookup');
logger.debug({ logger.debug({
err, err,
message: err.message, message: err.message,
...@@ -89,14 +94,24 @@ async function getDigest(registry, name, tag = 'latest') { ...@@ -89,14 +94,24 @@ async function getDigest(registry, name, tag = 'latest') {
} }
if (err.statusCode === 404) { if (err.statusCode === 404) {
logger.info( 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' 'Docker Manifest is unknown'
); );
return null; return null;
} }
if (err.statusCode >= 500 && err.statusCode < 600) { if (err.statusCode >= 500 && err.statusCode < 600) {
logger.warn( 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' 'docker registry failure: internal error'
); );
throw new Error('registry-failure'); throw new Error('registry-failure');
...@@ -110,7 +125,12 @@ async function getDigest(registry, name, tag = 'latest') { ...@@ -110,7 +125,12 @@ async function getDigest(registry, name, tag = 'latest') {
return null; return null;
} }
logger.info( 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' 'Unknown Error looking up docker image digest'
); );
return null; return null;
......
...@@ -33,13 +33,9 @@ function supportsDigests(purlStr) { ...@@ -33,13 +33,9 @@ function supportsDigests(purlStr) {
return !!datasources[purl.type].getDependency; return !!datasources[purl.type].getDependency;
} }
function getDigest(purlStr, value) { function getDigest(config, value) {
const purl = parse(purlStr); const purl = parse(config.purl);
return datasources[purl.type].getDigest( return datasources[purl.type].getDigest(config, value);
purl.qualifiers.registry,
purl.fullname,
value
);
} }
module.exports = { module.exports = {
......
...@@ -175,7 +175,7 @@ async function lookupUpdates(config) { ...@@ -175,7 +175,7 @@ async function lookupUpdates(config) {
// update digest for all // update digest for all
for (const update of res.updates) { for (const update of res.updates) {
if (config.pinDigests || config.currentDigest) { if (config.pinDigests || config.currentDigest) {
update.newDigest = await getDigest(config.purl, update.newValue); update.newDigest = await getDigest(config, update.newValue);
if (update.newDigest) { if (update.newDigest) {
update.newDigestShort = update.newDigest.slice(7, 13); update.newDigestShort = update.newDigest.slice(7, 13);
} else { } else {
......
...@@ -10,12 +10,18 @@ describe('api/docker', () => { ...@@ -10,12 +10,18 @@ describe('api/docker', () => {
}); });
it('returns null if no token', async () => { it('returns null if no token', async () => {
got.mockReturnValueOnce({ body: {} }); 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); expect(res).toBe(null);
}); });
it('returns null if errored', async () => { it('returns null if errored', async () => {
got.mockReturnValueOnce({ body: { token: 'some-token' } }); 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); expect(res).toBe(null);
}); });
it('returns digest', async () => { it('returns digest', async () => {
...@@ -23,7 +29,10 @@ describe('api/docker', () => { ...@@ -23,7 +29,10 @@ describe('api/docker', () => {
got.mockReturnValueOnce({ got.mockReturnValueOnce({
headers: { 'docker-content-digest': 'some-digest' }, 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'); expect(res).toBe('some-digest');
}); });
it('supports scoped names', async () => { it('supports scoped names', async () => {
...@@ -31,7 +40,10 @@ describe('api/docker', () => { ...@@ -31,7 +40,10 @@ describe('api/docker', () => {
got.mockReturnValueOnce({ got.mockReturnValueOnce({
headers: { 'docker-content-digest': 'some-digest' }, 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'); expect(res).toBe('some-digest');
}); });
}); });
......
...@@ -7,6 +7,8 @@ describe('datasource/index', () => { ...@@ -7,6 +7,8 @@ describe('datasource/index', () => {
expect(await datasource.getDependency('pkggithub/some/dep')).toBeNull(); expect(await datasource.getDependency('pkggithub/some/dep')).toBeNull();
}); });
it('returns getDigest', async () => { it('returns getDigest', async () => {
expect(await datasource.getDigest('pkg:docker/node')).toBeUndefined(); expect(
await datasource.getDigest({ purl: 'pkg:docker/node' })
).toBeUndefined();
}); });
}); });
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment