From 5d73738ddefd1ffa5c5f5c5942707b18f68689dc Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Tue, 27 Feb 2018 10:28:31 +0100
Subject: [PATCH] refactor: move docker registry to datasource

---
 .../registry.js => datasource/docker.js}      | 47 ++++++++++---------
 lib/manager/docker/package.js                 |  2 +-
 .../docker.spec.js}                           |  2 +-
 test/manager/docker/package.spec.js           |  2 +-
 4 files changed, 28 insertions(+), 25 deletions(-)
 rename lib/{manager/docker/registry.js => datasource/docker.js} (50%)
 rename test/{manager/docker/registry.spec.js => datasource/docker.spec.js} (96%)

diff --git a/lib/manager/docker/registry.js b/lib/datasource/docker.js
similarity index 50%
rename from lib/manager/docker/registry.js
rename to lib/datasource/docker.js
index 0318c34620..18d571b860 100644
--- a/lib/manager/docker/registry.js
+++ b/lib/datasource/docker.js
@@ -5,8 +5,13 @@ module.exports = {
   getTags,
 };
 
-async function getDigest(name, tag = 'latest') {
-  const repository = name.includes('/') ? name : `library/${name}`;
+const registry = 'https://index.docker.io/v2';
+
+function getRepository(pkgName) {
+  return pkgName.includes('/') ? pkgName : `library/${pkgName}`;
+}
+
+async function getHeaders(repository) {
   try {
     const authUrl = `https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repository}:pull`;
     logger.debug(`Obtaining docker registry token for ${repository}`);
@@ -15,12 +20,21 @@ async function getDigest(name, tag = 'latest') {
       logger.warn('Failed to obtain docker registry token');
       return null;
     }
-    logger.debug('Got docker registry token');
-    const url = `https://index.docker.io/v2/${repository}/manifests/${tag}`;
-    const headers = {
+    return {
       Authorization: `Bearer ${token}`,
       Accept: 'application/vnd.docker.distribution.manifest.v2+json',
     };
+  } catch (err) {
+    logger.info('Error obtaining docker token');
+    return null;
+  }
+}
+
+async function getDigest(name, tag = 'latest') {
+  try {
+    const repository = getRepository(name);
+    const headers = await getHeaders(repository);
+    const url = `${registry}/${repository}/manifests/${tag}`;
     const digest = (await got(url, { json: true, headers })).headers[
       'docker-content-digest'
     ];
@@ -33,24 +47,13 @@ async function getDigest(name, tag = 'latest') {
 }
 
 async function getTags(name) {
-  const repository = name.includes('/') ? name : `library/${name}`;
   try {
-    const authUrl = `https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repository}:pull`;
-    logger.debug(`Obtaining docker registry token for ${repository}`);
-    const { token } = (await got(authUrl, { json: true })).body;
-    if (!token) {
-      logger.warn('Failed to obtain docker registry token');
-      return null;
-    }
-    logger.debug('Got docker registry token');
-    const url = `https://index.docker.io/v2/${repository}/tags/list?n=10000`;
-    const headers = {
-      Authorization: `Bearer ${token}`,
-      Accept: 'application/vnd.docker.distribution.manifest.v2+json',
-    };
-    const res = await got(url, { json: true, headers });
-    logger.debug({ tags: res.body.tags }, 'Got docker tags');
-    return res.body.tags;
+    const repository = getRepository(name);
+    const url = `${registry}/${repository}/tags/list?n=10000`;
+    const headers = await getHeaders(repository);
+    const { tags } = (await got(url, { json: true, headers })).body;
+    logger.debug({ tags }, 'Got docker tags');
+    return tags;
   } catch (err) {
     logger.warn({ err, name }, 'Error getting docker image tags');
     return null;
diff --git a/lib/manager/docker/package.js b/lib/manager/docker/package.js
index 0783dc1a54..ddf6a47557 100644
--- a/lib/manager/docker/package.js
+++ b/lib/manager/docker/package.js
@@ -1,5 +1,5 @@
 const semver = require('semver');
-const dockerApi = require('./registry');
+const dockerApi = require('../../datasource/docker');
 const versions = require('../../workers/package/versions');
 const compareVersions = require('compare-versions');
 
diff --git a/test/manager/docker/registry.spec.js b/test/datasource/docker.spec.js
similarity index 96%
rename from test/manager/docker/registry.spec.js
rename to test/datasource/docker.spec.js
index 5d2509c489..cbd7efaa10 100644
--- a/test/manager/docker/registry.spec.js
+++ b/test/datasource/docker.spec.js
@@ -1,4 +1,4 @@
-const docker = require('../../../lib/manager/docker/registry');
+const docker = require('../../lib/datasource/docker');
 const got = require('got');
 
 jest.mock('got');
diff --git a/test/manager/docker/package.spec.js b/test/manager/docker/package.spec.js
index 97b560ef6d..7ee98d2fa5 100644
--- a/test/manager/docker/package.spec.js
+++ b/test/manager/docker/package.spec.js
@@ -1,4 +1,4 @@
-const dockerApi = require('../../../lib/manager/docker/registry');
+const dockerApi = require('../../../lib/datasource/docker');
 const docker = require('../../../lib/manager/docker/package');
 const defaultConfig = require('../../../lib/config/defaults').getConfig();
 
-- 
GitLab