John Cowen 2838f7a2e9
ui: Reduce discovery-chain log errors (#8065)
* ui: Reduce discovery-chain log spam

Currently the only way that the UI can know whether connect is enabled
or not is whether we get 500 errors from certain endpoints.

One of these endpoints we already use, so aswell as recovering from a
500 error, we also remember that connect is disabled for the rest of the
page 'session' (so until the page is refreshed), and make no further
http requests to the endpoint for that specific datacenter.

This means that log spam is reduced to only 1 log per page refresh/dc
instead of 1 log per service navigation.

Longer term we'll need some way to dynamically discover whether connect
is enabled per datacenter without relying on something that will add
error logs to consul.
2020-06-10 16:07:06 +01:00

110 lines
3.7 KiB
JavaScript

const not = `(n't| not)?`;
export default function(scenario, assert, lastNthRequest) {
// lastNthRequest should return a
// {
// method: '',
// requestBody: '',
// requestHeaders: ''
// }
scenario
.then('the last $method requests included from yaml\n$yaml', function(method, data) {
const requests = lastNthRequest(null, method);
const a = new Set(data);
const b = new Set(
requests.map(function(item) {
return item.url;
})
);
const diff = new Set(
[...a].filter(function(item) {
return !b.has(item);
})
);
assert.equal(diff.size, 0, `Expected requests "${[...diff].join(', ')}"`);
})
.then(`a $method request was${not} made to "$endpoint"`, function(method, negative, url) {
const isNegative = typeof negative !== 'undefined';
const requests = lastNthRequest(null, method);
const request = requests.some(function(item) {
return method === item.method && url === item.url;
});
if (isNegative) {
assert.notOk(request, `Didn't expect a ${method} request url to ${url}`);
} else {
assert.ok(request, `Expected a ${method} request url to ${url}`);
}
})
.then('a $method request was made to "$endpoint" with no body', function(method, url) {
const requests = lastNthRequest(null, method);
const request = requests.find(function(item) {
return method === item.method && url === item.url;
});
assert.equal(
request.requestBody,
null,
`Expected the request body to be null, was ${request.requestBody}`
);
})
.then('a $method request was made to "$endpoint" with the body "$body"', function(
method,
url,
body
) {
const requests = lastNthRequest(null, method);
const request = requests.find(function(item) {
return method === item.method && url === item.url;
});
assert.ok(request, `Expected a ${method} request url to ${url} with the body "${body}"`);
})
.then('a $method request was made to "$endpoint" from yaml\n$yaml', function(
method,
url,
yaml
) {
const requests = lastNthRequest(null, method);
const request = requests.find(function(item) {
return method === item.method && url === item.url;
});
let data = yaml.body || {};
const body = JSON.parse(request.requestBody);
Object.keys(data).forEach(function(key, i, arr) {
assert.deepEqual(
body[key],
data[key],
`Expected the payload to contain ${key} equaling ${JSON.stringify(
data[key]
)}, ${key} was ${JSON.stringify(body[key])}`
);
});
data = yaml.headers || {};
const headers = request.requestHeaders;
Object.keys(data).forEach(function(key, i, arr) {
assert.deepEqual(
headers[key],
data[key],
`Expected the payload to contain ${key} equaling ${JSON.stringify(
data[key]
)}, ${key} was ${JSON.stringify(headers[key])}`
);
});
})
.then('a $method request was made to "$endpoint" without properties from yaml\n$yaml', function(
method,
url,
properties
) {
const requests = lastNthRequest(null, method);
const request = requests.find(function(item) {
return method === item.method && url === item.url;
});
const body = JSON.parse(request.requestBody);
properties.forEach(function(key, i, arr) {
assert.equal(
typeof body[key],
'undefined',
`Expected payload to not have a ${key} property`
);
});
});
}