From a7ef1a31455eb91aaf6506a54ef184c662491175 Mon Sep 17 00:00:00 2001 From: Florian Greinacher Date: Fri, 2 Aug 2019 23:47:17 +0200 Subject: [PATCH] fix(docker): add support for querying tags from ECR 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 fa378d945ba4e0..7907cf3caea9da 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 8b891959b5b096..90e322975cd743 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 e91566d11df1da..87a815f7e7f17b 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({