From 6de255e18de288ac39a4c678fc79db2e19ab229c Mon Sep 17 00:00:00 2001
From: Florian Greinacher <fgreinacher@users.noreply.github.com>
Date: Sun, 4 Aug 2019 13:26:58 +0200
Subject: [PATCH] fix(docker): add support for querying tags from ECR (#4244)

Fixes #3800
---
 lib/datasource/docker/index.js                |  6 ++-
 .../__snapshots__/docker.spec.js.snap         | 45 +++++++++++++++++++
 test/datasource/docker.spec.js                | 14 ++++++
 3 files changed, 64 insertions(+), 1 deletion(-)

diff --git a/lib/datasource/docker/index.js b/lib/datasource/docker/index.js
index fa378d945b..7907cf3cae 100644
--- a/lib/datasource/docker/index.js
+++ b/lib/datasource/docker/index.js
@@ -270,7 +270,11 @@ async function getTags(registry, repository) {
     if (cachedResult) {
       return cachedResult;
     }
-    let url = `${registry}/v2/${repository}/tags/list?n=10000`;
+    // AWS ECR limits the maximum number of results to 1000
+    // See https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_DescribeRepositories.html#ECR-DescribeRepositories-request-maxResults
+    const ecrRegex = /\d+\.dkr\.ecr\.[-a-z0-9]+\.amazonaws\.com/;
+    const limit = ecrRegex.test(registry) ? 1000 : 10000;
+    let url = `${registry}/v2/${repository}/tags/list?n=${limit}`;
     const headers = await getAuthHeaders(registry, repository);
     if (!headers) {
       logger.debug('Failed to get authHeaders for getTags lookup');
diff --git a/test/datasource/__snapshots__/docker.spec.js.snap b/test/datasource/__snapshots__/docker.spec.js.snap
index 8b891959b5..90e322975c 100644
--- a/test/datasource/__snapshots__/docker.spec.js.snap
+++ b/test/datasource/__snapshots__/docker.spec.js.snap
@@ -351,3 +351,48 @@ Array [
   ],
 ]
 `;
+
+exports[`api/docker getPkgReleases uses lower tag limit for ECR deps 1`] = `
+[MockFunction] {
+  "calls": Array [
+    Array [
+      "https://123456789.dkr.ecr.us-east-1.amazonaws.com/v2/",
+      Object {
+        "throwHttpErrors": false,
+      },
+    ],
+    Array [
+      "https://123456789.dkr.ecr.us-east-1.amazonaws.com/v2/node/tags/list?n=1000",
+      Object {
+        "headers": Object {},
+        "json": true,
+      },
+    ],
+    Array [
+      "https://123456789.dkr.ecr.us-east-1.amazonaws.com/v2/",
+      Object {
+        "throwHttpErrors": false,
+      },
+    ],
+  ],
+  "results": Array [
+    Object {
+      "type": "return",
+      "value": Object {
+        "headers": Object {},
+      },
+    },
+    Object {
+      "type": "return",
+      "value": Object {
+        "body": Object {},
+        "headers": Object {},
+      },
+    },
+    Object {
+      "type": "return",
+      "value": undefined,
+    },
+  ],
+}
+`;
diff --git a/test/datasource/docker.spec.js b/test/datasource/docker.spec.js
index e91566d11d..87a815f7e7 100644
--- a/test/datasource/docker.spec.js
+++ b/test/datasource/docker.spec.js
@@ -224,6 +224,20 @@ describe('api/docker', () => {
       expect(res.releases).toHaveLength(1);
       expect(got).toMatchSnapshot();
     });
+    it('uses lower tag limit for ECR deps', async () => {
+      got.mockReturnValueOnce({ headers: {} });
+      got.mockReturnValueOnce({ headers: {}, body: {} });
+      await getPkgReleases({
+        datasource: 'docker',
+        depName: '123456789.dkr.ecr.us-east-1.amazonaws.com/node',
+      });
+      // The  tag limit parameter `n` needs to be limited to 1000 for ECR
+      // See https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_DescribeRepositories.html#ECR-DescribeRepositories-request-maxResults
+      expect(got.mock.calls[1][0]).toEqual(
+        'https://123456789.dkr.ecr.us-east-1.amazonaws.com/v2/node/tags/list?n=1000'
+      );
+      expect(got).toMatchSnapshot();
+    });
     it('adds library/ prefix for Docker Hub (implicit)', async () => {
       const tags = ['1.0.0'];
       got.mockReturnValueOnce({
-- 
GitLab