diff --git a/lib/datasource/galaxy/__snapshots__/index.spec.ts.snap b/lib/datasource/galaxy/__snapshots__/index.spec.ts.snap index 353f92b6b228b728cb2996ba3a5460847ea2476b..c4afc6a3cd8360932e3b699f94edfc41ac6356d5 100644 --- a/lib/datasource/galaxy/__snapshots__/index.spec.ts.snap +++ b/lib/datasource/galaxy/__snapshots__/index.spec.ts.snap @@ -20,3 +20,5 @@ Object { "sourceUrl": "https://github.com/yatesr/ansible-timezone", } `; + +exports[`datasource/galaxy getPkgReleases throws for 5xx 1`] = `[Error: registry-failure]`; diff --git a/lib/datasource/galaxy/index.spec.ts b/lib/datasource/galaxy/index.spec.ts index 35b4c0892f4c30307e58daa38e2ba3d440580e92..20917e18adf5c5543b89931d5c551dd082532c4f 100644 --- a/lib/datasource/galaxy/index.spec.ts +++ b/lib/datasource/galaxy/index.spec.ts @@ -51,5 +51,28 @@ describe('datasource/galaxy', () => { const res = await getPkgReleases({ lookupName: 'foo.bar' }); expect(res).toBeNull(); }); + it('throws for 5xx', async () => { + got.mockImplementationOnce(() => + Promise.reject({ + statusCode: 502, + }) + ); + let e; + try { + await getPkgReleases({ lookupName: 'some_crate' }); + } catch (err) { + e = err; + } + expect(e).toBeDefined(); + expect(e).toMatchSnapshot(); + }); + it('throws for 404', async () => { + const err = new Error(); + err.statusCode = 404; + got.mockImplementationOnce(() => { + throw err; + }); + await expect(getPkgReleases({ lookupName: 'foo.bar' })).rejects.toThrow(); + }); }); }); diff --git a/lib/datasource/galaxy/index.ts b/lib/datasource/galaxy/index.ts index 95961c90760f5020624263e497b2766b056aae32..5b7d7b2664b3635d5db094d788dc64771c0084ac 100644 --- a/lib/datasource/galaxy/index.ts +++ b/lib/datasource/galaxy/index.ts @@ -1,6 +1,11 @@ import { logger } from '../../logger'; import got from '../../util/got'; -import { GetReleasesConfig, ReleaseResult, Release } from '../common'; +import { + DatasourceError, + GetReleasesConfig, + ReleaseResult, + Release, +} from '../common'; export const id = 'galaxy'; @@ -30,65 +35,73 @@ export async function getPkgReleases({ '&name=' + projectName; const galaxyProjectUrl = baseUrl + userName + '/' + projectName; + try { + let res: any = await got(galaxyAPIUrl, { + hostType: id, + }); + if (!res || !res.body) { + logger.warn( + { dependency: lookupName }, + `Received invalid crate data from ${galaxyAPIUrl}` + ); + return null; + } - let res: any = await got(galaxyAPIUrl, { - hostType: id, - }); - if (!res || !res.body) { - logger.warn( - { dependency: lookupName }, - `Received invalid crate data from ${galaxyAPIUrl}` - ); - return null; - } - - res = res.body; - const response = JSON.parse(res); + res = res.body; + const response = JSON.parse(res); - // istanbul ignore if - if (response.results.length > 1) { - logger.warn( - { dependency: lookupName }, - `Received multiple results from ${galaxyAPIUrl}` - ); - return null; - } - if (response.results.length === 0) { - logger.warn( - { dependency: lookupName }, - `Received no results from ${galaxyAPIUrl}` - ); - return null; - } + // istanbul ignore if + if (response.results.length > 1) { + logger.warn( + { dependency: lookupName }, + `Received multiple results from ${galaxyAPIUrl}` + ); + return null; + } + if (response.results.length === 0) { + logger.warn( + { dependency: lookupName }, + `Received no results from ${galaxyAPIUrl}` + ); + return null; + } - const resultObject = response.results[0]; - const versions = resultObject.summary_fields.versions; + const resultObject = response.results[0]; + const versions = resultObject.summary_fields.versions; - const result: ReleaseResult = { - releases: [], - }; + const result: ReleaseResult = { + releases: [], + }; - result.dependencyUrl = galaxyProjectUrl; - if (resultObject.github_user && resultObject.github_repo) { - result.sourceUrl = - 'https://github.com/' + - resultObject.github_user + - '/' + - resultObject.github_repo; - } + result.dependencyUrl = galaxyProjectUrl; + if (resultObject.github_user && resultObject.github_repo) { + result.sourceUrl = + 'https://github.com/' + + resultObject.github_user + + '/' + + resultObject.github_repo; + } - result.releases = versions.map( - (version: { name: string; release_date: string }) => { - const release: Release = { - version: version.name, - releaseTimestamp: version.release_date, - }; + result.releases = versions.map( + (version: { name: string; release_date: string }) => { + const release: Release = { + version: version.name, + releaseTimestamp: version.release_date, + }; - return release; + return release; + } + ); + const cacheMinutes = 10; + await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes); + return result; + } catch (err) { + if ( + err.statusCode === 429 || + (err.statusCode >= 500 && err.statusCode < 600) + ) { + throw new DatasourceError(err); } - ); - - const cacheMinutes = 10; - await renovateCache.set(cacheNamespace, cacheKey, result, cacheMinutes); - return result; + throw err; + } }