-
Notifications
You must be signed in to change notification settings - Fork 1.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
UI: Retry stats requests #4195
UI: Retry stats requests #4195
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
export default function generateResources() { | ||
return { | ||
CpuStats: { | ||
Measured: ['Throttled Periods', 'Throttled Time', 'Percent'], | ||
Percent: 0.14159538847117795, | ||
SystemMode: 0, | ||
ThrottledPeriods: 0, | ||
ThrottledTime: 0, | ||
TotalTicks: 300.256693934837093, | ||
UserMode: 0, | ||
}, | ||
MemoryStats: { | ||
Cache: 1744896, | ||
KernelMaxUsage: 0, | ||
KernelUsage: 0, | ||
MaxUsage: 4710400, | ||
Measured: ['RSS', 'Cache', 'Swap', 'Max Usage'], | ||
RSS: 1486848009, | ||
Swap: 0, | ||
}, | ||
}; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
import { getOwner } from '@ember/application'; | ||
import { test, moduleForComponent } from 'ember-qunit'; | ||
import wait from 'ember-test-helpers/wait'; | ||
import hbs from 'htmlbars-inline-precompile'; | ||
import generateResources from '../../mirage/data/generate-resources'; | ||
import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; | ||
import Response from 'ember-cli-mirage/response'; | ||
|
||
moduleForComponent('allocation-row', 'Integration | Component | allocation row', { | ||
integration: true, | ||
beforeEach() { | ||
this.store = getOwner(this).lookup('service:store'); | ||
this.server = startMirage(); | ||
this.server.create('namespace'); | ||
this.server.create('node'); | ||
this.server.create('job', { createAllocations: false }); | ||
}, | ||
afterEach() { | ||
this.server.shutdown(); | ||
}, | ||
}); | ||
|
||
test('Allocation row polls for stats, even when it errors or has an invalid response', function(assert) { | ||
const component = this; | ||
|
||
let currentFrame = 0; | ||
let frames = [ | ||
JSON.stringify({ ResourceUsage: generateResources() }), | ||
JSON.stringify({ ResourceUsage: generateResources() }), | ||
null, | ||
'<Not>Valid JSON</Not>', | ||
JSON.stringify({ ResourceUsage: generateResources() }), | ||
]; | ||
const backoffSequence = [50]; | ||
|
||
this.server.get('/client/allocation/:id/stats', function() { | ||
const response = frames[++currentFrame]; | ||
|
||
// Disable polling to stop the EC task in the component | ||
if (currentFrame >= frames.length) { | ||
component.set('enablePolling', false); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I haven't seen this idea before, pretty neat. Did you consider using There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I ran through a lot of combinations, but not the Sounds like it would work, but since I already have this |
||
} | ||
|
||
if (response) { | ||
return response; | ||
} | ||
return new Response(500, {}, ''); | ||
}); | ||
|
||
this.server.create('allocation'); | ||
this.store.findAll('allocation'); | ||
|
||
let allocation; | ||
|
||
return wait() | ||
.then(() => { | ||
allocation = this.store.peekAll('allocation').get('firstObject'); | ||
|
||
this.setProperties({ | ||
allocation, | ||
backoffSequence, | ||
context: 'job', | ||
enablePolling: true, | ||
}); | ||
|
||
this.render(hbs` | ||
{{allocation-row | ||
allocation=allocation | ||
context=context | ||
backoffSequence=backoffSequence | ||
enablePolling=enablePolling}} | ||
`); | ||
return wait(); | ||
}) | ||
.then(() => { | ||
assert.equal( | ||
this.server.pretender.handledRequests.filterBy( | ||
'url', | ||
`/v1/client/allocation/${allocation.get('id')}/stats` | ||
).length, | ||
frames.length, | ||
'Requests continue to be made after malformed responses and server errors' | ||
); | ||
}); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lol