Skip to content
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

Even number across racks #906

Merged
merged 10 commits into from
Mar 22, 2016
62 changes: 56 additions & 6 deletions SingularityUI/app/models/Request.coffee
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
Model = require './model'

Racks = require '../collections/Racks'

pauseTemplate = require '../templates/vex/requestPause'
scaleTemplate = require '../templates/vex/requestScale'
scaleEvenNumbersTemplate = require '../templates/vex/requestScaleConfirmRacks'
unpauseTemplate = require '../templates/vex/requestUnpause'
runTemplate = require '../templates/vex/requestRun'
removeTemplate = require '../templates/vex/requestRemove'
Expand Down Expand Up @@ -235,7 +238,46 @@ class Request extends Model
if !duration or (duration and @_validateDuration(duration, @promptPause, callback))
@pause(killTasks, duration, message).done callback

promptScale: (callback) =>
callScale: (data, bounce, incremental, message, duration, callback) =>
@scale(data).done =>
if bounce
@bounce({incremental}).done callback
else
callback()

promptScaleEvenNumberRacks: (scaleData) =>
vex.dialog.open
message: scaleEvenNumbersTemplate
instances: parseInt(scaleData.data.instances)
notOneInstance: parseInt(scaleData.data.instances) != 1
racks: @racks.length
notOneRack: @racks.length != 1
mod: scaleData.mod
modNotOne: scaleData.mod != 1
lower: parseInt(scaleData.data.instances) - scaleData.mod
higher: parseInt(scaleData.data.instances) + @racks.length - scaleData.mod
config: config
input: """

"""
buttons: [
$.extend _.clone(vex.dialog.buttons.YES), text: "Scale"
vex.dialog.buttons.NO
]
scaleData: scaleData # Not sure why this is necessary, callback for whatever reason doesn't have access to the function's variables
callback: (data) =>
return unless data
scaleData.data.instances = data.instances
@callScale scaleData.data, scaleData.bounce, scaleData.incremental, scaleData.message, scaleData.duration, scaleData.callback

checkScaleEvenNumberRacks: (data, bounce, incremental, message, duration, callback) =>
return 0 unless @attributes.request.rackSensitive
if not @racks
@racks = new Racks []
@racks.fetch { async: false }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should be sure to catch errors here. If the call to fetch the number of racks fails for some reason, we should allow the user to continue without the extra prompt

return data.instances %% @racks.length

promptScale: (callback, stuff) =>
vex.dialog.open
message: "Enter the desired number of instances to run for request:"
input:
Expand All @@ -261,11 +303,19 @@ class Request extends Model
message = $('.vex #scale-message').val()
duration = $('.vex #scale-expiration').val()
if !duration or (duration and @_validateDuration(duration, @promptScale, callback))
@scale(data).done =>
if bounce
@bounce({incremental}).done callback
else
callback()
mod = @checkScaleEvenNumberRacks data, bounce, incremental, message, duration, callback
if mod
@promptScaleEvenNumberRacks
callback: callback
data: data
mod: mod
bounce: bounce
incremental: incremental
message: message
duration: duration
else
@callScale data, bounce, incremental, message, duration, callback


promptDisableHealthchecksDuration: (message, duration, callback) =>
durationMillis = @_parseDuration(duration)
Expand Down
41 changes: 41 additions & 0 deletions SingularityUI/app/templates/vex/requestScaleConfirmRacks.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<p>
We cannot distribute {{ instances }}
{{#if notOneInstance}}
instances
{{else}}
instance
{{/if}}
evenly across our {{ racks }}
{{#if notOneRack}}
racks.
{{else}}
rack.
{{/if}}
This will result in increased load on {{mod}}
{{#if modNotOne}}
racks.
{{else}}
rack.
{{/if}}
</p>
<p>
We suggest scaling to
{{#if lower}}
either <strong>{{ lower }}</strong> or
{{/if}}
<strong>{{ higher }}</strong> instances.
How many instances would you like to scale to?
</p>
<div id="instances">
{{#if lower}}
<input type="radio" name="instances" id="lower" value="{{ lower }}"> <label for="lower" id="lower-label">{{ lower }} instances</label><br/>
{{/if}}
<input type="radio" name="instances" id="default" value="{{ instances }}" checked> <label for="default" id="default-label">{{ instances }}
{{#if notOneInstance}}
instances
{{else}}
instance
{{/if}}
</label><br/>
<input type="radio" name="instances" id="higher" value="{{ higher }}"> <label for="higher" id="higher-label">{{ higher }} instances</label><br/>
</div>