5
0
Fork 0
mirror of https://github.com/hashicorp/vault-action.git synced 2025-11-07 07:06:56 +00:00

Retry on 412 status codes (#333)

* Retry on 412 status codes
* Add retry tests
This commit is contained in:
Tom Proctor 2022-06-29 12:55:26 +01:00 committed by GitHub
parent ad04ab9377
commit 55a11671e0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 956 additions and 2 deletions

View file

@ -1,5 +1,9 @@
## Unreleased ## Unreleased
Bugs:
* Errors due to replication delay for tokens will now be retried [GH-333](https://github.com/hashicorp/vault-action/pull/333)
## 2.4.1 (April 28th, 2022) ## 2.4.1 (April 28th, 2022)
Improvements: Improvements:

873
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -58,6 +58,7 @@
"@zeit/ncc": "^0.22.3", "@zeit/ncc": "^0.22.3",
"jest": "^28.1.1", "jest": "^28.1.1",
"jest-when": "^3.5.1", "jest-when": "^3.5.1",
"mock-http-server": "^1.4.5",
"semantic-release": "^19.0.3" "semantic-release": "^19.0.3"
} }
} }

View file

@ -26,7 +26,15 @@ async function exportSecrets() {
const defaultOptions = { const defaultOptions = {
prefixUrl: vaultUrl, prefixUrl: vaultUrl,
headers: {}, headers: {},
https: {} https: {},
retry: {
statusCodes: [
...got.defaults.options.retry.statusCodes,
// Vault returns 412 when the token in use hasn't yet been replicated
// to the performance replica queried. See issue #332.
412,
]
}
} }
const tlsSkipVerify = (core.getInput('tlsSkipVerify', { required: false }) || 'false').toLowerCase() != 'false'; const tlsSkipVerify = (core.getInput('tlsSkipVerify', { required: false }) || 'false').toLowerCase() != 'false';

View file

@ -8,7 +8,6 @@ const got = require('got');
const { const {
exportSecrets, exportSecrets,
parseSecretsInput, parseSecretsInput,
parseResponse,
parseHeadersInput parseHeadersInput
} = require('./action'); } = require('./action');

69
src/retries.test.js Normal file
View file

@ -0,0 +1,69 @@
jest.mock('@actions/core');
const core = require('@actions/core');
const ServerMock = require("mock-http-server");
const { exportSecrets } = require("./action");
const { when } = require('jest-when');
describe('exportSecrets retries', () => {
var server = new ServerMock({ host: "127.0.0.1", port: 0 });
var calls = 0;
beforeEach((done) => {
calls = 0;
jest.resetAllMocks();
when(core.getInput)
.calledWith('token', expect.anything())
.mockReturnValueOnce('EXAMPLE');
when(core.getInput)
.calledWith('secrets', expect.anything())
.mockReturnValueOnce("kv/mysecret key");
server.start(() => {
expect(server.getHttpPort()).not.toBeNull();
when(core.getInput)
.calledWith('url', expect.anything())
.mockReturnValueOnce('http://127.0.0.1:' + server.getHttpPort());
done();
});
});
afterEach((done) => {
server.stop(done);
});
function mockStatusCodes(statusCodes) {
server.on({
path: '/v1/kv/mysecret',
reply: {
status: function() {
let status = statusCodes[calls];
calls += 1;
return status;
},
headers: { "content-type": "application/json" },
body: function() {
return JSON.stringify({ data: {"key": "value"} })
}
}
});
}
it('retries on 412 status code', (done) => {
mockStatusCodes([412, 200])
exportSecrets().then(() => {
expect(calls).toEqual(2);
done();
});
});
it('retries on 500 status code', (done) => {
mockStatusCodes([500, 200])
exportSecrets().then(() => {
expect(calls).toEqual(2);
done();
});
});
});