From 2331e79897eb60dc355257f7c52cddb02d74b03e Mon Sep 17 00:00:00 2001 From: Iain Billett Date: Thu, 17 Sep 2020 14:18:13 +0100 Subject: [PATCH] Test for docker before attempting to run a container (#2497) Test for docker using ping() before attempting any docker operations. If this fails we know docker is unavailable and we can fail with an more descriptive error. --- .../techdocs/stages/generate/helpers.test.ts | 38 +++++++++++++++++++ .../src/techdocs/stages/generate/helpers.ts | 8 ++++ 2 files changed, 46 insertions(+) diff --git a/plugins/techdocs-backend/src/techdocs/stages/generate/helpers.test.ts b/plugins/techdocs-backend/src/techdocs/stages/generate/helpers.test.ts index 799e79ef67..283560f0ce 100644 --- a/plugins/techdocs-backend/src/techdocs/stages/generate/helpers.test.ts +++ b/plugins/techdocs-backend/src/techdocs/stages/generate/helpers.test.ts @@ -51,6 +51,10 @@ describe('helpers', () => { jest .spyOn(mockDocker, 'run') .mockResolvedValue([{ Error: null, StatusCode: 0 }]); + + jest + .spyOn(mockDocker, 'ping') + .mockResolvedValue(Buffer.from('OK', 'utf-8')); }); const imageName = 'spotify/techdocs'; @@ -99,5 +103,39 @@ describe('helpers', () => { }, ); }); + + it('should ping docker to test availability', async () => { + await runDockerContainer({ + imageName, + args, + docsDir, + resultDir, + dockerClient: mockDocker, + }); + + expect(mockDocker.ping).toHaveBeenCalled(); + }); + + describe('where docker is unavailable', () => { + const dockerError = 'a docker error'; + + beforeEach(() => { + jest.spyOn(mockDocker, 'ping').mockImplementationOnce(() => { + throw new Error(dockerError); + }); + }); + + it('should throw with a descriptive error message including the docker error message', async () => { + await expect( + runDockerContainer({ + imageName, + args, + docsDir, + resultDir, + dockerClient: mockDocker, + }), + ).rejects.toThrow(new RegExp(`.+: ${dockerError}`)); + }); + }); }); }); diff --git a/plugins/techdocs-backend/src/techdocs/stages/generate/helpers.ts b/plugins/techdocs-backend/src/techdocs/stages/generate/helpers.ts index 88667f9903..9f33823444 100644 --- a/plugins/techdocs-backend/src/techdocs/stages/generate/helpers.ts +++ b/plugins/techdocs-backend/src/techdocs/stages/generate/helpers.ts @@ -47,6 +47,14 @@ export async function runDockerContainer({ dockerClient, createOptions, }: RunDockerContainerOptions) { + try { + await dockerClient.ping(); + } catch (e) { + throw new Error( + `This operation requires Docker. Docker does not appear to be available. Docker.ping() failed with: ${e.message}`, + ); + } + await new Promise((resolve, reject) => { dockerClient.pull(imageName, {}, (err, stream) => { if (err) return reject(err);