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