Merge "Some basic unit tests for the tuskar.boxes js module"
This commit is contained in:
commit
3f43c3ab4f
@ -3,67 +3,67 @@ tuskar.boxes = (function () {
|
|||||||
|
|
||||||
var module = {};
|
var module = {};
|
||||||
|
|
||||||
|
|
||||||
|
module.get_role_counts = function ($flavor) {
|
||||||
|
var roles = {};
|
||||||
|
$flavor.find('div.boxes-drop-roles div.boxes-role').each(function () {
|
||||||
|
var $this = $(this);
|
||||||
|
var name = $this.data('name');
|
||||||
|
var count = +$this.find('input.number-picker').val();
|
||||||
|
roles[name] = count;
|
||||||
|
});
|
||||||
|
return roles;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.update_maximums = function ($flavor, roles, nodes) {
|
||||||
|
var used = 0;
|
||||||
|
$.each(roles, function (key, value) { used += value; });
|
||||||
|
$flavor.find('div.boxes-drop-roles div.boxes-role').each(function () {
|
||||||
|
var $this = $(this);
|
||||||
|
var role = $this.data('name');
|
||||||
|
var $picker = $this.find('input.number-picker');
|
||||||
|
$picker.attr('max', Math.max(0, nodes - used + roles[role]));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
module.update_nodes = function ($flavor, roles) {
|
||||||
|
var role_names = Object.getOwnPropertyNames(roles);
|
||||||
|
var count = 0;
|
||||||
|
var role = 0;
|
||||||
|
$flavor.find('div.boxes-nodes div.boxes-node').each(function () {
|
||||||
|
var $this = $(this);
|
||||||
|
$this.removeClass('boxes-role-controller boxes-role-compute boxes-role-cinder-storage boxes-role-swift-storage boxes-role-none');
|
||||||
|
while (count >= roles[role_names[role]]) {
|
||||||
|
role += 1;
|
||||||
|
count = 0;
|
||||||
|
}
|
||||||
|
if (!role_names[role]) {
|
||||||
|
$(this).html('free');
|
||||||
|
$(this).addClass('boxes-role-none');
|
||||||
|
} else {
|
||||||
|
$this.addClass('boxes-role-' + role_names[role]).html(' ');
|
||||||
|
}
|
||||||
|
count += 1;
|
||||||
|
});
|
||||||
|
var free_nodes = $flavor.find('div.boxes-nodes div.boxes-role-none').length;
|
||||||
|
$flavor.find('span.free-nodes').text(free_nodes);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.update_boxes = function () {
|
||||||
|
$('div.boxes-flavor').each(function () {
|
||||||
|
var $flavor = $(this);
|
||||||
|
var role_counts = module.get_role_counts($flavor);
|
||||||
|
var nodes_count = $flavor.find('div.boxes-nodes div.boxes-node').length;
|
||||||
|
module.update_nodes($flavor, role_counts);
|
||||||
|
module.update_maximums($flavor, role_counts, nodes_count);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
module.init = function () {
|
module.init = function () {
|
||||||
if ($('div.boxes-available-roles').length === 0) {
|
if ($('div.boxes-available-roles').length === 0) {
|
||||||
// Only activate on a page that has the right classes.
|
// Only activate on a page that has the right classes.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_role_counts($flavor) {
|
|
||||||
var roles = {};
|
|
||||||
$flavor.find('div.boxes-drop-roles div.boxes-role').each(function () {
|
|
||||||
var $this = $(this);
|
|
||||||
var name = $this.data('name');
|
|
||||||
var count = +$this.find('input.number-picker').val();
|
|
||||||
roles[name] = count;
|
|
||||||
});
|
|
||||||
return roles;
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_maximums($flavor, roles) {
|
|
||||||
var nodes = $flavor.find('div.boxes-nodes div.boxes-node').length;
|
|
||||||
var used = 0;
|
|
||||||
$.each(roles, function (key, value) { used += value; });
|
|
||||||
$flavor.find('div.boxes-drop-roles div.boxes-role').each(function () {
|
|
||||||
var $this = $(this);
|
|
||||||
var role = $this.data('name');
|
|
||||||
var $picker = $this.find('input.number-picker');
|
|
||||||
$picker.attr('max', Math.max(0, nodes - used + roles[role]));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_nodes($flavor, roles) {
|
|
||||||
var role_names = Object.getOwnPropertyNames(roles);
|
|
||||||
var count = 0;
|
|
||||||
var role = 0;
|
|
||||||
$flavor.find('div.boxes-nodes div.boxes-node').each(function () {
|
|
||||||
var $this = $(this);
|
|
||||||
$this.removeClass('boxes-role-controller boxes-role-compute boxes-role-cinder-storage boxes-role-swift-storage boxes-role-none');
|
|
||||||
while (count >= roles[role_names[role]]) {
|
|
||||||
role += 1;
|
|
||||||
count = 0;
|
|
||||||
}
|
|
||||||
if (!role_names[role]) {
|
|
||||||
$(this).html('free');
|
|
||||||
$(this).addClass('boxes-role-none');
|
|
||||||
} else {
|
|
||||||
$this.addClass('boxes-role-' + role_names[role]).html(' ');
|
|
||||||
}
|
|
||||||
count += 1;
|
|
||||||
});
|
|
||||||
var free_nodes = $flavor.find('div.boxes-nodes div.boxes-role-none').length;
|
|
||||||
$flavor.find('span.free-nodes').text(free_nodes);
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_boxes() {
|
|
||||||
$('div.boxes-flavor').each(function () {
|
|
||||||
var $flavor = $(this);
|
|
||||||
var roles = get_role_counts($flavor);
|
|
||||||
update_nodes($flavor, roles);
|
|
||||||
update_maximums($flavor, roles);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
$('div.boxes-role').draggable({
|
$('div.boxes-role').draggable({
|
||||||
revert: 'invalid',
|
revert: 'invalid',
|
||||||
helper: 'clone',
|
helper: 'clone',
|
||||||
@ -82,7 +82,7 @@ tuskar.boxes = (function () {
|
|||||||
ui.draggable.find('input.boxes-flavor'
|
ui.draggable.find('input.boxes-flavor'
|
||||||
).val($(this).closest('.boxes-flavor').data('flavor'));
|
).val($(this).closest('.boxes-flavor').data('flavor'));
|
||||||
$count.trigger('change');
|
$count.trigger('change');
|
||||||
window.setTimeout(update_boxes, 0);
|
window.setTimeout(module.update_boxes, 0);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
$('div.boxes-available-roles').droppable({
|
$('div.boxes-available-roles').droppable({
|
||||||
@ -94,12 +94,12 @@ tuskar.boxes = (function () {
|
|||||||
ui.draggable.appendTo(this);
|
ui.draggable.appendTo(this);
|
||||||
ui.draggable.find('input.boxes-flavor').val('');
|
ui.draggable.find('input.boxes-flavor').val('');
|
||||||
ui.draggable.find('input.number-picker').trigger('change').val(0);
|
ui.draggable.find('input.number-picker').trigger('change').val(0);
|
||||||
window.setTimeout(update_boxes, 0);
|
window.setTimeout(module.update_boxes, 0);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
update_boxes();
|
module.update_boxes();
|
||||||
$('input.number-picker').change(update_boxes);
|
$('input.number-picker').change(module.update_boxes);
|
||||||
|
|
||||||
$('.boxes-roles-menu li a').click(function () {
|
$('.boxes-roles-menu li a').click(function () {
|
||||||
var name = $(this).data('role');
|
var name = $(this).data('role');
|
||||||
@ -111,7 +111,7 @@ tuskar.boxes = (function () {
|
|||||||
if (+$count.val() < 1) { $count.val(1); }
|
if (+$count.val() < 1) { $count.val(1); }
|
||||||
$flavor.val($drop.closest('.boxes-flavor').data('flavor'));
|
$flavor.val($drop.closest('.boxes-flavor').data('flavor'));
|
||||||
$count.trigger('change');
|
$count.trigger('change');
|
||||||
window.setTimeout(update_boxes, 0);
|
window.setTimeout(module.update_boxes, 0);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3,7 +3,58 @@ horizon.addInitFunction(function () {
|
|||||||
|
|
||||||
module("Tuskar boxes (tuskar.boxes.js)");
|
module("Tuskar boxes (tuskar.boxes.js)");
|
||||||
|
|
||||||
test("Passing test", function () {
|
test("get_role_counts", function () {
|
||||||
equal(1, 1);
|
var $flavor = $($('div.boxes-flavor')[0]);
|
||||||
|
var role_counts = tuskar.boxes.get_role_counts($flavor);
|
||||||
|
|
||||||
|
deepEqual(role_counts, {
|
||||||
|
"cinder-storage": 0,
|
||||||
|
"compute": 1,
|
||||||
|
"controller": 1,
|
||||||
|
"swift-storage": 0
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test("update_maximums", function () {
|
||||||
|
var $flavor = $($('div.boxes-flavor')[0]);
|
||||||
|
var role_counts = {
|
||||||
|
"cinder-storage": 0,
|
||||||
|
"compute": 2,
|
||||||
|
"controller": 1,
|
||||||
|
"swift-storage": 0
|
||||||
|
};
|
||||||
|
|
||||||
|
tuskar.boxes.update_maximums($flavor, role_counts, 4);
|
||||||
|
equal($('div.boxes-role-cinder-storage input.number-picker').attr('max'), 1);
|
||||||
|
equal($('div.boxes-role-compute input.number-picker').attr('max'), 3);
|
||||||
|
equal($('div.boxes-role-controller input.number-picker').attr('max'), 2);
|
||||||
|
equal($('div.boxes-role-swift-storage input.number-picker').attr('max'), 1);
|
||||||
|
tuskar.boxes.update_maximums($flavor, role_counts, 2);
|
||||||
|
equal($('div.boxes-role-cinder-storage input.number-picker').attr('max'), 0);
|
||||||
|
equal($('div.boxes-role-compute input.number-picker').attr('max'), 1);
|
||||||
|
equal($('div.boxes-role-controller input.number-picker').attr('max'), 0);
|
||||||
|
equal($('div.boxes-role-swift-storage input.number-picker').attr('max'), 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("update_nodes", function() {
|
||||||
|
var $flavor = $($('div.boxes-flavor')[0]);
|
||||||
|
var role_counts = {
|
||||||
|
"cinder-storage": 0,
|
||||||
|
"compute": 2,
|
||||||
|
"controller": 1,
|
||||||
|
"swift-storage": 0
|
||||||
|
};
|
||||||
|
|
||||||
|
equal($('div.boxes-nodes div.boxes-role-').length, 2);
|
||||||
|
equal($('div.boxes-nodes div.boxes-role-cinder-storage').length, 0);
|
||||||
|
equal($('div.boxes-nodes div.boxes-role-compute').length, 1);
|
||||||
|
equal($('div.boxes-nodes div.boxes-role-controller').length, 1);
|
||||||
|
equal($('div.boxes-nodes div.boxes-role-swift-storage').length, 0);
|
||||||
|
tuskar.boxes.update_nodes($flavor, role_counts);
|
||||||
|
equal($('div.boxes-nodes div.boxes-role-none').length, 1);
|
||||||
|
equal($('div.boxes-nodes div.boxes-role-cinder-storage').length, 0);
|
||||||
|
equal($('div.boxes-nodes div.boxes-role-compute').length, 2);
|
||||||
|
equal($('div.boxes-nodes div.boxes-role-controller').length, 1);
|
||||||
|
equal($('div.boxes-nodes div.boxes-role-swift-storage').length, 0);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -22,5 +22,57 @@
|
|||||||
<h2 id="qunit-userAgent"></h2>
|
<h2 id="qunit-userAgent"></h2>
|
||||||
<ol id="qunit-tests"></ol>
|
<ol id="qunit-tests"></ol>
|
||||||
<div id="qunit-fixture">
|
<div id="qunit-fixture">
|
||||||
|
|
||||||
|
<div class="boxes-available-roles"></div>
|
||||||
|
|
||||||
|
<div class="boxes-flavor" data-flavor="baremetal">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-9"><strong>Flavor:</strong> <i>baremetal</i> x86_64, 1 CPU, 4096MB RAM, 30GB Disk</div>
|
||||||
|
<div class="col-md-3"><span class="pull-right">Free Nodes:<span class="free-nodes"></span> / 4 </span></div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12"><div class="separator-line"></div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-5"><div class="boxes-drop-roles">
|
||||||
|
<div class="boxes-role-controller boxes-role" data-name="controller">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-3 deploy-role-count"><input class="form-control number-picker" id="id_09c48fdc-ed80-4e9c-bc57-3c2783bf4dc0-count" min="1" name="09c48fdc-ed80-4e9c-bc57-3c2783bf4dc0-count" step="2" type="text" value="1" /><input class="boxes-flavor form-control" id="id_09c48fdc-ed80-4e9c-bc57-3c2783bf4dc0-flavor" name="09c48fdc-ed80-4e9c-bc57-3c2783bf4dc0-flavor" type="hidden" value="baremetal" /></div>
|
||||||
|
<div class="col-xs-6 deploy-role-label"><div class="deployment-roles-label">Controller</div></div>
|
||||||
|
<div class="col-xs-3 deploy-role-icon"><a name="role-edit-controller" href="/infrastructure/roles/09c48fdc-ed80-4e9c-bc57-3c2783bf4dc0/edit" class="btn"><b class="fa fa-lg fa-fw fa-pencil"></b></a></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="boxes-role-swift-storage boxes-role" data-name="swift-storage" >
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-3 deploy-role-count"><input class="form-control number-picker" id="id_a2b6038e-d891-49f7-aeb7-a92dc38abca8-count" min="0" name="a2b6038e-d891-49f7-aeb7-a92dc38abca8-count" step="1" type="text" value="0" /><input class="boxes-flavor form-control" id="id_a2b6038e-d891-49f7-aeb7-a92dc38abca8-flavor" name="a2b6038e-d891-49f7-aeb7-a92dc38abca8-flavor" type="hidden" value="baremetal" /></div>
|
||||||
|
<div class="col-xs-6 deploy-role-label"><div class="deployment-roles-label">Swift-Storage</div></div>
|
||||||
|
<div class="col-xs-3 deploy-role-icon"><a name="role-edit-swift-storage" href="/infrastructure/roles/a2b6038e-d891-49f7-aeb7-a92dc38abca8/edit" class="btn"><b class="fa fa-lg fa-fw fa-pencil"></b></a></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="boxes-role-compute boxes-role" data-name="compute" >
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-3 deploy-role-count"><input class="form-control number-picker" id="id_8c14fa61-8a62-4a6a-b43e-970769cf8aa2-count" min="1" name="8c14fa61-8a62-4a6a-b43e-970769cf8aa2-count" step="1" type="text" value="1" /><input class="boxes-flavor form-control" id="id_8c14fa61-8a62-4a6a-b43e-970769cf8aa2-flavor" name="8c14fa61-8a62-4a6a-b43e-970769cf8aa2-flavor" type="hidden" value="baremetal" /></div>
|
||||||
|
<div class="col-xs-6 deploy-role-label"><div class="deployment-roles-label">Compute</div></div>
|
||||||
|
<div class="col-xs-3 deploy-role-icon"><a name="role-edit-compute" href="/infrastructure/roles/8c14fa61-8a62-4a6a-b43e-970769cf8aa2/edit" class="btn"><b class="fa fa-lg fa-fw fa-pencil"></b></a></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="boxes-role-cinder-storage boxes-role" data-name="cinder-storage" >
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-3 deploy-role-count"><input class="form-control number-picker" id="id_aa3f46c1-7f7b-4adc-8b06-bcb18254f93f-count" min="0" name="aa3f46c1-7f7b-4adc-8b06-bcb18254f93f-count" step="1" type="text" value="0" /><input class="boxes-flavor form-control" id="id_aa3f46c1-7f7b-4adc-8b06-bcb18254f93f-flavor" name="aa3f46c1-7f7b-4adc-8b06-bcb18254f93f-flavor" type="hidden" value="baremetal" /></div>
|
||||||
|
<div class="col-xs-6 deploy-role-label"><div class="deployment-roles-label">Cinder-Storage</div></div>
|
||||||
|
<div class="col-xs-3 deploy-role-icon"><a name="role-edit-cinder-storage" href="/infrastructure/roles/aa3f46c1-7f7b-4adc-8b06-bcb18254f93f/edit" class="btn"><b class="fa fa-lg fa-fw fa-pencil"></b></a></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="btn-group boxes-drop-group"></div>
|
||||||
|
</div>
|
||||||
|
<div class="boxes-nodes col-xs-7">
|
||||||
|
<div class="boxes-node boxes-role-" data-toggle="popover" title="Free node" data-content="<dl><dt>Node UUID</dt><dd>a085de77-b2ee-4876-9c90-e5d6cc8ade77</dd><dt>Architecture</dt><dd>x86_64</dd><dt>CPUs</dt><dd>1</dt><dt>RAM (MB)</dt><dd>4096</dd><dt>HDD (GB)</dt><dd>40</dd></dl>"><i class="fa fa-lg fa-minus"></i></div>
|
||||||
|
<div class="boxes-node boxes-role-" data-toggle="popover" title="Free node" data-content="<dl><dt>Node UUID</dt><dd>5470033e-1c2a-4c5c-90c7-7d96da56ba61</dd><dt>Architecture</dt><dd>x86_64</dd><dt>CPUs</dt><dd>1</dt><dt>RAM (MB)</dt><dd>4096</dd><dt>HDD (GB)</dt><dd>40</dd></dl>"><i class="fa fa-lg fa-minus"></i></div>
|
||||||
|
<div class="boxes-node boxes-role-compute" data-toggle="popover" title="Compute node" data-content="<dl><dt>Node UUID</dt><dd>d783b2e4-059e-4e2b-a1d1-21b3d1a7dab6</dd><dt>Architecture</dt><dd>x86_64</dd><dt>CPUs</dt><dd>1</dt><dt>RAM (MB)</dt><dd>4096</dd><dt>HDD (GB)</dt><dd>40</dd></dl>"><i class="fa fa-lg fa-check"></i></div>
|
||||||
|
<div class="boxes-node boxes-role-controller" data-toggle="popover" title="Controller node" data-content="<dl><dt>Node UUID</dt><dd>9262d80e-7a25-4ded-abca-3261a77dbae1</dd><dt>Architecture</dt><dd>x86_64</dd><dt>CPUs</dt><dd>1</dt><dt>RAM (MB)</dt><dd>4096</dd><dt>HDD (GB)</dt><dd>40</dd></dl>"><i class="fa fa-lg fa-check"></i></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body></html>
|
</body></html>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user