mirror of
https://github.com/renovatebot/renovate.git
synced 2025-01-12 06:56:24 +00:00
refactor(docker): break out manifest retrieval function (#2931)
This commit is contained in:
parent
8c2cad0647
commit
9ac84fa4e3
2 changed files with 98 additions and 51 deletions
|
@ -102,6 +102,82 @@ function extractDigestFromResponse(manifestResponse) {
|
||||||
return manifestResponse.headers['docker-content-digest'];
|
return manifestResponse.headers['docker-content-digest'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function getManifestResponse(registry, repository, tag) {
|
||||||
|
logger.debug(`getManifestResponse(${registry}, ${repository}, ${tag})`);
|
||||||
|
try {
|
||||||
|
const headers = await getAuthHeaders(registry, repository);
|
||||||
|
if (!headers) {
|
||||||
|
logger.info('No docker auth found - returning');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
headers.accept = 'application/vnd.docker.distribution.manifest.v2+json';
|
||||||
|
const url = `${registry}/v2/${repository}/manifests/${tag}`;
|
||||||
|
const manifestResponse = await got(url, {
|
||||||
|
headers,
|
||||||
|
timeout: 10000,
|
||||||
|
});
|
||||||
|
return manifestResponse;
|
||||||
|
} catch (err) /* istanbul ignore next */ {
|
||||||
|
if (err.message === 'registry-failure') {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
if (err.statusCode === 401) {
|
||||||
|
logger.info(
|
||||||
|
{ registry, dockerRepository: repository },
|
||||||
|
'Unauthorized docker lookup'
|
||||||
|
);
|
||||||
|
logger.debug({ err });
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (err.statusCode === 404) {
|
||||||
|
logger.info(
|
||||||
|
{
|
||||||
|
err,
|
||||||
|
registry,
|
||||||
|
repository,
|
||||||
|
tag,
|
||||||
|
},
|
||||||
|
'Docker Manifest is unknown'
|
||||||
|
);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (err.statusCode === 429 && registry.endsWith('docker.io')) {
|
||||||
|
logger.warn({ err }, 'docker registry failure: too many requests');
|
||||||
|
throw new Error('registry-failure');
|
||||||
|
}
|
||||||
|
if (err.statusCode >= 500 && err.statusCode < 600) {
|
||||||
|
logger.warn(
|
||||||
|
{
|
||||||
|
err,
|
||||||
|
registry,
|
||||||
|
repository,
|
||||||
|
tag,
|
||||||
|
},
|
||||||
|
'docker registry failure: internal error'
|
||||||
|
);
|
||||||
|
throw new Error('registry-failure');
|
||||||
|
}
|
||||||
|
if (err.code === 'ETIMEDOUT') {
|
||||||
|
logger.info(
|
||||||
|
{ registry },
|
||||||
|
'Timeout when attempting to connect to docker registry'
|
||||||
|
);
|
||||||
|
logger.debug({ err });
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
logger.info(
|
||||||
|
{
|
||||||
|
err,
|
||||||
|
registry,
|
||||||
|
repository,
|
||||||
|
tag,
|
||||||
|
},
|
||||||
|
'Unknown Error looking up docker manifest'
|
||||||
|
);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* docker.getDigest
|
* docker.getDigest
|
||||||
*
|
*
|
||||||
|
@ -125,17 +201,10 @@ async function getDigest(config, newValue) {
|
||||||
if (cachedResult) {
|
if (cachedResult) {
|
||||||
return cachedResult;
|
return cachedResult;
|
||||||
}
|
}
|
||||||
const headers = await getAuthHeaders(massagedRegistry, repository);
|
const manifestResponse = await getManifestResponse(massagedRegistry, repository, newTag);
|
||||||
if (!headers) {
|
if (!manifestResponse) {
|
||||||
logger.info('No docker auth found - returning');
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
headers.accept = 'application/vnd.docker.distribution.manifest.v2+json';
|
|
||||||
const url = `${massagedRegistry}/v2/${repository}/manifests/${newTag}`;
|
|
||||||
const manifestResponse = await got(url, {
|
|
||||||
headers,
|
|
||||||
timeout: 10000,
|
|
||||||
});
|
|
||||||
const digest = extractDigestFromResponse(manifestResponse);
|
const digest = extractDigestFromResponse(manifestResponse);
|
||||||
logger.debug({ digest }, 'Got docker digest');
|
logger.debug({ digest }, 'Got docker digest');
|
||||||
const cacheMinutes = 30;
|
const cacheMinutes = 30;
|
||||||
|
@ -145,48 +214,6 @@ async function getDigest(config, newValue) {
|
||||||
if (err.message === 'registry-failure') {
|
if (err.message === 'registry-failure') {
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
if (err.statusCode === 401) {
|
|
||||||
logger.info(
|
|
||||||
{ dockerRegistry, dockerRepository: repository },
|
|
||||||
'Unauthorized docker lookup'
|
|
||||||
);
|
|
||||||
logger.debug({ err });
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (err.statusCode === 404) {
|
|
||||||
logger.info(
|
|
||||||
{
|
|
||||||
err,
|
|
||||||
depName,
|
|
||||||
newTag,
|
|
||||||
},
|
|
||||||
'Docker Manifest is unknown'
|
|
||||||
);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (err.statusCode === 429 && massagedRegistry.endsWith('docker.io')) {
|
|
||||||
logger.warn({ err }, 'docker registry failure: too many requests');
|
|
||||||
throw new Error('registry-failure');
|
|
||||||
}
|
|
||||||
if (err.statusCode >= 500 && err.statusCode < 600) {
|
|
||||||
logger.warn(
|
|
||||||
{
|
|
||||||
err,
|
|
||||||
depName,
|
|
||||||
newTag,
|
|
||||||
},
|
|
||||||
'docker registry failure: internal error'
|
|
||||||
);
|
|
||||||
throw new Error('registry-failure');
|
|
||||||
}
|
|
||||||
if (err.code === 'ETIMEDOUT') {
|
|
||||||
logger.info(
|
|
||||||
{ massagedRegistry },
|
|
||||||
'Timeout when attempting to connect to docker registry'
|
|
||||||
);
|
|
||||||
logger.debug({ err });
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
logger.info(
|
logger.info(
|
||||||
{
|
{
|
||||||
err,
|
err,
|
||||||
|
|
|
@ -141,6 +141,26 @@ describe('api/docker', () => {
|
||||||
);
|
);
|
||||||
expect(res).toBe('some-digest');
|
expect(res).toBe('some-digest');
|
||||||
});
|
});
|
||||||
|
it('should throw error for 429', async () => {
|
||||||
|
got.mockRejectedValueOnce({statusCode: 429});
|
||||||
|
let e;
|
||||||
|
try {
|
||||||
|
await docker.getDigest({ depName: 'some-dep' }, 'latest');
|
||||||
|
} catch (err) {
|
||||||
|
e = err;
|
||||||
|
}
|
||||||
|
expect(e.message).toBe('registry-failure');
|
||||||
|
});
|
||||||
|
it('should throw error for 5xx', async () => {
|
||||||
|
got.mockRejectedValueOnce({statusCode: 503});
|
||||||
|
let e;
|
||||||
|
try {
|
||||||
|
await docker.getDigest({ depName: 'some-dep' }, 'latest');
|
||||||
|
} catch (err) {
|
||||||
|
e = err;
|
||||||
|
}
|
||||||
|
expect(e.message).toBe('registry-failure');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
describe('getPkgReleases', () => {
|
describe('getPkgReleases', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
|
Loading…
Reference in a new issue