Kimchi-devel
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- 3775 discussions
[PATCH] [Kimchi] Modified unit test cases to include new s390x specific features
by pkulkark@linux.vnet.ibm.com 16 Sep '16
by pkulkark@linux.vnet.ibm.com 16 Sep '16
16 Sep '16
From: Pooja Kulkarni <pkulkark(a)linux.vnet.ibm.com>
This patch modifies the unit test cases
to include the new features introduced
for s390x in vm interfaces (macvtap and ovs)
and ovsbridges api.
Signed-off-by: Pooja Kulkarni <pkulkark(a)linux.vnet.ibm.com>
---
tests/test_model.py | 25 ++++++++++++++++++
tests/test_rest.py | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 99 insertions(+)
diff --git a/tests/test_model.py b/tests/test_model.py
index ff2a6cb..6509e21 100644
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -651,6 +651,31 @@ class ModelTests(unittest.TestCase):
iface = inst.vmiface_lookup(vm_name, mac)
self.assertEquals(mac, iface['mac'])
+ if os.uname()[4] == "s390x":
+
+ # attach macvtap interface to vm
+ iface_args = {"type": "macvtap",
+ "source": "test-network",
+ "mode": "vepa"}
+ mac = inst.vmifaces_create(vm_name, iface_args)
+ rollback.prependDefer(inst.vmiface_delete, vm_name, mac)
+
+ iface = inst.vmiface_lookup(vm_name, mac)
+ self.assertEquals("macvtap", iface["type"])
+ self.assertEquals("test-network", iface['source'])
+ self.assertEquals("vepa", iface['mode'])
+
+ # attach ovs interface to vm
+ iface_args = {"type": "ovs",
+ "source": "test-network"}
+ mac = inst.vmifaces_create(vm_name, iface_args)
+ rollback.prependDefer(inst.vmiface_delete, vm_name, mac)
+
+ iface = inst.vmiface_lookup(vm_name, mac)
+ self.assertEquals("ovs", iface["type"])
+ self.assertEquals("test-network", iface['source'])
+
+
@unittest.skipUnless(utils.running_as_root(), 'Must be run as root')
def test_vm_netboot(self):
inst = model.Model(objstore_loc=self.tmp_store)
diff --git a/tests/test_rest.py b/tests/test_rest.py
index 3a61d13..b672f47 100644
--- a/tests/test_rest.py
+++ b/tests/test_rest.py
@@ -967,6 +967,19 @@ class RestTests(unittest.TestCase):
'POST')
self.assertEquals(400, resp.status)
+ # try to attach an interface of type "macvtap" without source
+ if os.uname()[4] == "s390x":
+ req = json.dumps({'type': 'macvtap'})
+ resp = self.request('/plugins/kimchi/vms/test-vm/ifaces', req,
+ 'POST')
+ self.assertEqual(400, resp.status)
+
+ #try to attach an interface of type "ovs" without source
+ req = json.dumps({'type': 'ovs'})
+ resp = self.request('/plugins/kimchi/vms/test-vm/ifaces', req,
+ 'POST')
+ self.assertEqual(400, resp.status)
+
# attach network interface to vm
req = json.dumps({"type": "network",
"network": "test-network",
@@ -1018,6 +1031,63 @@ class RestTests(unittest.TestCase):
iface['mac'], '{}', 'DELETE')
self.assertEquals(204, resp.status)
+ if os.uname()[4] == "s390x":
+ # attach macvtap interface to vm
+ req = json.dumps({"type": "macvtap",
+ "source": "test-network"})
+ resp = self.request('/plugins/kimchi/vms/test-vm/ifaces', req,
+ 'POST')
+ self.assertEquals(201, resp.status)
+ iface = json.loads(resp.read())
+
+ self.assertEquals('test-network', iface['source'])
+ self.assertEquals('macvtap', iface['type'])
+
+ # Start the VM
+ resp = self.request('/plugins/kimchi/vms/test-vm/start', '{}',
+ 'POST')
+ vm = json.loads(self.request('/plugins/kimchi/vms/test-vm').read())
+ self.assertEquals('running', vm['state'])
+
+ # Force poweroff the VM
+ resp = self.request('/plugins/kimchi/vms/test-vm/poweroff', '{}',
+ 'POST')
+ vm = json.loads(self.request('/plugins/kimchi/vms/test-vm').read())
+ self.assertEquals('shutoff', vm['state'])
+
+ # detach network interface from vm
+ resp = self.request('/plugins/kimchi/vms/test-vm/ifaces/%s' %
+ iface['mac'], '{}', 'DELETE')
+ self.assertEquals(204, resp.status)
+
+ # attach ovs interface to vm
+ req = json.dumps({"type": "ovs",
+ "source": "test-network"})
+ resp = self.request('/plugins/kimchi/vms/test-vm/ifaces', req,
+ 'POST')
+ self.assertEquals(201, resp.status)
+ iface = json.loads(resp.read())
+
+ self.assertEquals('test-network', iface['source'])
+ self.assertEquals('ovs', iface['type'])
+
+ # Start the VM
+ resp = self.request('/plugins/kimchi/vms/test-vm/start', '{}',
+ 'POST')
+ vm = json.loads(self.request('/plugins/kimchi/vms/test-vm').read())
+ self.assertEquals('running', vm['state'])
+
+ # Force poweroff the VM
+ resp = self.request('/plugins/kimchi/vms/test-vm/poweroff', '{}',
+ 'POST')
+ vm = json.loads(self.request('/plugins/kimchi/vms/test-vm').read())
+ self.assertEquals('shutoff', vm['state'])
+
+ # detach ovs interface from vm
+ resp = self.request('/plugins/kimchi/vms/test-vm/ifaces/%s' %
+ iface['mac'], '{}', 'DELETE')
+ self.assertEquals(204, resp.status)
+
def test_vm_customise_storage(self):
# Create a Template
req = json.dumps({'name': 'test', 'disks': DISKS,
@@ -1434,6 +1504,10 @@ class RestTests(unittest.TestCase):
if distro.get('reason'):
self.assertIn('KCHDISTRO0001E', distro.get('reason'))
+ def test_ovsbridges(self):
+ resp = self.request('/plugins/kimchi/ovsbridges')
+ self.assertEquals(200, resp.status)
+
class HttpsRestTests(RestTests):
"""
--
2.1.0
2
1
[PATCH] [Kimchi] Introducing s390x UI Interfaces module for Edit Template under virtualization
by rajgupta@linux.vnet.ibm.com 16 Sep '16
by rajgupta@linux.vnet.ibm.com 16 Sep '16
16 Sep '16
From: Rajat Gupta <rajgupta(a)linux.vnet.ibm.com>
V4 :
Resolved merge conflict
V3 :
Rebase to next branch
V2 :
corrected Indentation
V1 :
Introducing s390x UI Interfaces module for Edit Template under virtualization
Signed-off-by: Rajat Gupta <rajgupta(a)linux.vnet.ibm.com>
---
ui/js/src/kimchi.api.js | 44 ++++++
ui/js/src/kimchi.main.js | 5 +
ui/js/src/kimchi.template_edit_main.js | 243 +++++++++++++++++++++++++++++++--
ui/pages/template-edit.html.tmpl | 29 ++++
4 files changed, 306 insertions(+), 15 deletions(-)
diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js
index 2f127aa..950ca00 100644
--- a/ui/js/src/kimchi.api.js
+++ b/ui/js/src/kimchi.api.js
@@ -596,6 +596,34 @@ var kimchi = {
});
},
+ listmacvtapNetworks: function(suc, err) {
+ wok.requestJSON({
+ url: 'plugins/kimchi/interfaces?type=^nic|bonding|vlan$',
+ type: 'GET',
+ contentType: 'application/json',
+ dataType: 'json',
+ resend: true,
+ success: suc,
+ error: err ? err : function(data) {
+ wok.message.error(data.responseJSON.reason);
+ }
+ });
+ },
+
+ listovsNetworks: function(suc, err) {
+ wok.requestJSON({
+ url: 'plugins/kimchi/ovsbridges',
+ type: 'GET',
+ contentType: 'application/json',
+ dataType: 'json',
+ resend: true,
+ success: suc,
+ error: err ? err : function(data) {
+ wok.message.error(data.responseJSON.reason);
+ }
+ });
+ },
+
toggleNetwork : function(name, on, suc, err) {
var action = on ? "activate" : "deactivate";
wok.requestJSON({
@@ -1271,3 +1299,19 @@ var kimchi = {
});
}
};
+
+ /**
+ * Get the host information.
+ */
+
+ kimchi.getHostDetails = function(suc, err) {
+ wok.requestJSON({
+ url: 'plugins/gingerbase/host',
+ type: 'GET',
+ resend: true,
+ contentType: 'application/json',
+ dataType: 'json',
+ success: suc,
+ error: err
+ });
+ }
diff --git a/ui/js/src/kimchi.main.js b/ui/js/src/kimchi.main.js
index b6de2cf..f3078ec 100644
--- a/ui/js/src/kimchi.main.js
+++ b/ui/js/src/kimchi.main.js
@@ -33,6 +33,11 @@ kimchi.getCapabilities(function(result) {
kimchi.capabilities = {};
});
+kimchi.hostarch = undefined;
+kimchi.getHostDetails(function(result) {
+ kimchi.hostarch = result["architecture"];
+});
+
$(function(){
$('body').removeClass('wok-list wok-gallery');
});
diff --git a/ui/js/src/kimchi.template_edit_main.js b/ui/js/src/kimchi.template_edit_main.js
index 7036211..7d7cce3 100644
--- a/ui/js/src/kimchi.template_edit_main.js
+++ b/ui/js/src/kimchi.template_edit_main.js
@@ -19,8 +19,13 @@ kimchi.template_edit_main = function() {
var templateEditMain = $('#edit-template-tabs');
var origDisks;
var origNetworks;
+ var origInterfaces;
+ var origmacvtapNetworks;
+ var origovsNetworks;
var templateDiskSize;
var baseImageTemplate;
+ var s390xArch = 's390x';
+
$('#template-name', templateEditMain).val(kimchi.selectedTemplate);
$('#edit-template-tabs a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
$('.tab-content').css('overflow', 'hidden');
@@ -47,6 +52,7 @@ kimchi.template_edit_main = function() {
var initTemplate = function(template) {
origDisks = template.disks;
origNetworks = template.networks;
+ origInterfaces = template.interfaces;
for (var i = 0; i < template.disks.length; i++) {
if (template.disks[i].base) {
template["vm-image"] = template.disks[i].base;
@@ -449,10 +455,170 @@ kimchi.template_edit_main = function() {
});
};
- var initProcessor = function() {
- var setCPUValue = function() {
- if (!$('#cores').hasClass("invalid-field") && $('#cores').val() != "") {
- var computedCpu = parseInt($("#cores").val()) * parseInt($("#threads").val());
+ var initInterface_s390x = function(result) {
+ $('#form-template-interface-s390x').show();
+ $('#form-template-interface').hide();
+ var networkItemNum = 0;
+ var addInterfaceItem = function(networkData) {
+ var networkName = networkData.networkV;
+ var nodeInterface = $.parseHTML(wok.substitute($('#template-interface-s390x-tmpl').html(), networkData));
+ $('.template-tab-body', '#form-template-interface-s390x').append(nodeInterface);
+ $('.delete', '#form-template-interface-s390x').on("click", function(event) {
+ event.preventDefault();
+ $(this).parent().parent().remove();
+ });
+
+ //initialize type option
+ var typeOptionsdata = {};
+ var typeOptions = '';
+ typeOptionsdata.macvtap = 'macvtap';
+ typeOptionsdata.ovs = 'ovs';
+ typeOptionsdata.network = 'network';
+
+ $.each(typeOptionsdata, function(key, value) {
+ if (value === networkData.type) {
+ typeOptions += '<option value="' + key + '" selected="selected">' + networkData.type + '</option>';
+ } else {
+ typeOptions += '<option value="' + key + '">' + value + '</option>';
+ }
+ });
+
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.type').append(typeOptions);
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.type').on('change', function() {
+ var itemNode = $(this).closest('div.item');
+
+ switch ($(this).val()) {
+ case 'macvtap':
+ $('span.mode .label-mode', itemNode).addClass('hide');
+ $('span.mode .bootstrap-select', itemNode).toggleClass("hide", false);
+
+ var networkOptions = '';
+ for (var i = 0; i < origmacvtapNetworks.length; i++) {
+ networkOptions += '<option>' + origmacvtapNetworks[i].name + '</option>';
+ }
+
+ $('span.network select', itemNode).empty().append(networkOptions);
+ $('span.network select', itemNode).selectpicker('refresh');
+
+ break;
+ case 'ovs':
+ $('span.mode .label-mode', itemNode).removeClass('hide');
+ $('span.mode .bootstrap-select', itemNode).toggleClass("hide", true);
+ var networkOptions = '';
+ for (var i = 0; i < origovsNetworks.length; i++) {
+ networkOptions += '<option>' + origovsNetworks[i] + '</option>';
+ }
+
+ $('span.network select', itemNode).empty().append(networkOptions);
+ $('span.network select', itemNode).selectpicker('refresh');
+
+ break;
+ case 'network':
+ $('span.mode .label-mode', itemNode).removeClass('hide');
+ $('span.mode .bootstrap-select', itemNode).toggleClass("hide", true);
+
+ var networkOptions = '';
+ for (var i = 0; i < result.length; i++) {
+ if (result[i].state === "active") {
+ networkOptions += '<option>' + result[i].name + '</option>';
+ }
+ }
+ $('span.network select', itemNode).empty().append(networkOptions);
+ $('span.network select', itemNode).selectpicker('refresh');
+ break;
+ }
+ });
+
+ switch (networkData.type) {
+ case 'macvtap':
+ //initialize network option
+ var networkOptions = '';
+ for (var i = 0; i < origmacvtapNetworks.length; i++) {
+ if (networkName === origmacvtapNetworks[i].name) {
+ networkOptions += '<option selected="selected">' + origmacvtapNetworks[i].name + '</option>';
+ }
+ networkOptions += '<option>' + origmacvtapNetworks[i].name + '</option>';
+ }
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.network').append(networkOptions);
+
+ //initialize Mode option for Macvtap
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.mode').val(networkData.mode);
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.mode').selectpicker('refresh');
+
+ $('span.mode .label-mode', nodeInterface).addClass('hide');
+ $('span.mode .bootstrap-select', nodeInterface).removeClass("hide");
+
+ break;
+ case 'ovs':
+ var networkOptions = '';
+ for (var i = 0; i < origovsNetworks.length; i++) {
+ if (networkName === origovsNetworks[i]) {
+ networkOptions += '<option selected="selected">' + origovsNetworks[i] + '</option>';
+ }
+ networkOptions += '<option>' + origovsNetworks[i] + '</option>';
+ }
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.network').append(networkOptions);
+
+ //initialize Mode option for ovs
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.mode').selectpicker('refresh');
+ $('span.mode .label-mode', nodeInterface).removeClass('hide');
+ $('span.mode .bootstrap-select', nodeInterface).addClass("hide");
+ break;
+ case 'network':
+ var networkOptions = '';
+ for (var i = 0; i < result.length; i++) {
+ if (networkName === result[i].name) {
+ networkOptions += '<option selected="selected">' + result[i].name + '</option>';
+ }
+ if (result[i].state === "active" && networkName !== result[i].name) {
+ networkOptions += '<option>' + result[i].name + '</option>';
+ }
+ }
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.network').append(networkOptions);
+
+ //initialize Mode option for Network
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.mode').selectpicker('refresh');
+ $('span.mode .label-mode', nodeInterface).removeClass('hide');
+ $('span.mode .bootstrap-select', nodeInterface).addClass("hide");
+ break;
+ }
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum).selectpicker();
+ networkItemNum += 1;
+ };
+ if (origInterfaces && origInterfaces.length > 0) {
+ for (var i = 0; i < origInterfaces.length; i++) {
+ addInterfaceItem({
+ networkID: 'networkID' + networkItemNum,
+ networkV: origInterfaces[i].name,
+ type: origInterfaces[i].type,
+ mode: origInterfaces[i].mode
+ });
+ }
+ }
+ if (result && result.length > 0) {
+ for (var i = 0; i < origNetworks.length; i++) {
+ addInterfaceItem({
+ networkID: 'networkID' + networkItemNum,
+ networkV: origNetworks[i],
+ type: 'network'
+ });
+ }
+ }
+ $('#template-edit-interface-add-button-s390x').on("click", function(event) {
+ event.preventDefault();
+ addInterfaceItem({
+ networkID: 'networkID' + networkItemNum,
+ networkV: 'default',
+ type: 'network',
+ mode: 'None'
+ });
+ });
+ };
+
+ var initProcessor = function(){
+ var setCPUValue = function(){
+ if(!$('#cores').hasClass("invalid-field")&&$('#cores').val()!=""){
+ var computedCpu = parseInt($("#cores").val())*parseInt($("#threads").val());
$("#vcpus").val(computedCpu);
if ($("#cpus-check").prop("checked")) {
//If topology is checked, set maxcpu to be the same as # of cpu otherwise, backend gives error
@@ -641,18 +807,65 @@ kimchi.template_edit_main = function() {
topology: {}
};
}
- var networks = $('.template-tab-body .item', '#form-template-interface');
- var networkForUpdate = new Array();
- $.each(networks, function(index, networkEntities) {
- var thisValue = $('select', networkEntities).val();
- networkForUpdate.push(thisValue);
+
+ if(kimchi.hostarch === s390xArch){
+ var interfaces = $('.template-tab-body .item', '#form-template-interface-s390x');
+ var networkForUpdate = new Array();
+ var interfacceForUpdate = new Array();
+
+ $.each(interfaces, function(index, interfaceEntities) {
+ var fields = $('span.type select', interfaceEntities);
+ switch(fields.val()){
+ case 'network':
+ var thisValue = $('span.network select', interfaceEntities).val();
+ networkForUpdate.push(thisValue);
+ break;
+ case 'macvtap':
+ var thisdata = {};
+ thisdata.type = $('span.type select', interfaceEntities).val();
+ thisdata.name = $('span.network select', interfaceEntities).val();
+ thisdata.mode = $('span.mode select', interfaceEntities).val();
+ interfacceForUpdate.push(thisdata);
+ break;
+ case 'ovs':
+ var thisdata = {};
+ thisdata.type = $('span.type select', interfaceEntities).val();
+ thisdata.name = $('span.network select', interfaceEntities).val();
+ interfacceForUpdate.push(thisdata);
+ break;
+ }
+
+ if (networkForUpdate instanceof Array) {
+ data.networks = networkForUpdate;
+ } else if (networkForUpdate != null) {
+ data.networks = [networkForUpdate];
+ } else {
+ data.networks = [];
+ }
+
+ if (networkForUpdate instanceof Array) {
+ data.interfaces = interfacceForUpdate;
+ } else if (interfacceForUpdate != null) {
+ data.interfaces = [interfacceForUpdate];
+ } else {
+ data.interfaces = [];
+ }
});
- if (networkForUpdate instanceof Array) {
- data.networks = networkForUpdate;
- } else if (networkForUpdate != null) {
- data.networks = [networkForUpdate];
- } else {
- data.networks = [];
+ }else {
+ var networks = $('.template-tab-body .item', '#form-template-interface');
+ var networkForUpdate = new Array();
+ $.each(networks, function(index, networkEntities) {
+ var thisValue = $('select', networkEntities).val();
+ networkForUpdate.push(thisValue);
+ });
+
+ if (networkForUpdate instanceof Array) {
+ data.networks = networkForUpdate;
+ } else if (networkForUpdate != null) {
+ data.networks = [networkForUpdate];
+ } else {
+ data.networks = [];
+ }
}
if ($('.has-error', '#form-template-storage').length) {
diff --git a/ui/pages/template-edit.html.tmpl b/ui/pages/template-edit.html.tmpl
index 06c40fb..9ccc664 100644
--- a/ui/pages/template-edit.html.tmpl
+++ b/ui/pages/template-edit.html.tmpl
@@ -140,6 +140,15 @@
</div>
<div class="template-tab-body"></div>
</form>
+ <form id="form-template-interface-s390x" style="display:none">
+ <div class="template-tab-header">
+ <span class="template-interface-cell type">$_("Type")</span>
+ <span class="template-interface-cell network">$_("Network/Interface")</span>
+ <span class="template-interface-cell mode">$_("Mode")</span>
+ <button type="button" id="template-edit-interface-add-button-s390x" class="pull-right btn btn-primary"><i class="fa fa-plus-circle"></i> $_("Add Interface")</button>
+ </div>
+ <div class="template-tab-body"></div>
+ </form>
</div>
<div role="tabpanel" class="tab-pane" id="processor">
<form id="form-template-processor">
@@ -242,5 +251,25 @@
</span>
</div>
</script>
+<script id="template-interface-s390x-tmpl" type="text/html">
+ <div class="item" id={networkID}>
+ <span class="template-interface-cell type">
+ <select></select>
+ </span>
+ <span class="template-interface-cell network">
+ <select></select>
+ </span>
+ <span class="template-interface-cell mode">
+ <span class="label-mode hide">None</span>
+ <select>
+ <option value="bridge">bridge</option>
+ <option value="vepa">vepa</option>
+ </select>
+ </span>
+ <span class="pull-right">
+ <button class="delete btn-primary btn"><i class="fa fa-minus-circle"></i> $_("Delete")</button>
+ </span>
+ </div>
+</script>
</body>
</html>
--
2.1.0
2
1
[PATCH V3] [Kimchi] Introducing s390x UI Interfaces module for Edit Template under virtualization
by archus@linux.vnet.ibm.com 16 Sep '16
by archus@linux.vnet.ibm.com 16 Sep '16
16 Sep '16
From: Rajat Gupta <rajgupta(a)linux.vnet.ibm.com>
Introducing s390x UI Interfaces module for Edit Template under virtualization
Signed-off-by: Rajat Gupta <rajgupta(a)linux.vnet.ibm.com>
---
ui/js/src/kimchi.api.js | 44 ++++++
ui/js/src/kimchi.main.js | 5 +
ui/js/src/kimchi.template_edit_main.js | 257 +++++++++++++++++++++++++++++++--
ui/pages/template-edit.html.tmpl | 29 ++++
4 files changed, 319 insertions(+), 16 deletions(-)
diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js
index 2f127aa..950ca00 100644
--- a/ui/js/src/kimchi.api.js
+++ b/ui/js/src/kimchi.api.js
@@ -596,6 +596,34 @@ var kimchi = {
});
},
+ listmacvtapNetworks: function(suc, err) {
+ wok.requestJSON({
+ url: 'plugins/kimchi/interfaces?type=^nic|bonding|vlan$',
+ type: 'GET',
+ contentType: 'application/json',
+ dataType: 'json',
+ resend: true,
+ success: suc,
+ error: err ? err : function(data) {
+ wok.message.error(data.responseJSON.reason);
+ }
+ });
+ },
+
+ listovsNetworks: function(suc, err) {
+ wok.requestJSON({
+ url: 'plugins/kimchi/ovsbridges',
+ type: 'GET',
+ contentType: 'application/json',
+ dataType: 'json',
+ resend: true,
+ success: suc,
+ error: err ? err : function(data) {
+ wok.message.error(data.responseJSON.reason);
+ }
+ });
+ },
+
toggleNetwork : function(name, on, suc, err) {
var action = on ? "activate" : "deactivate";
wok.requestJSON({
@@ -1271,3 +1299,19 @@ var kimchi = {
});
}
};
+
+ /**
+ * Get the host information.
+ */
+
+ kimchi.getHostDetails = function(suc, err) {
+ wok.requestJSON({
+ url: 'plugins/gingerbase/host',
+ type: 'GET',
+ resend: true,
+ contentType: 'application/json',
+ dataType: 'json',
+ success: suc,
+ error: err
+ });
+ }
diff --git a/ui/js/src/kimchi.main.js b/ui/js/src/kimchi.main.js
index b6de2cf..f3078ec 100644
--- a/ui/js/src/kimchi.main.js
+++ b/ui/js/src/kimchi.main.js
@@ -33,6 +33,11 @@ kimchi.getCapabilities(function(result) {
kimchi.capabilities = {};
});
+kimchi.hostarch = undefined;
+kimchi.getHostDetails(function(result) {
+ kimchi.hostarch = result["architecture"];
+});
+
$(function(){
$('body').removeClass('wok-list wok-gallery');
});
diff --git a/ui/js/src/kimchi.template_edit_main.js b/ui/js/src/kimchi.template_edit_main.js
index a2032cc..9ccf9cc 100644
--- a/ui/js/src/kimchi.template_edit_main.js
+++ b/ui/js/src/kimchi.template_edit_main.js
@@ -19,8 +19,13 @@ kimchi.template_edit_main = function() {
var templateEditMain = $('#edit-template-tabs');
var origDisks;
var origNetworks;
+ var origInterfaces;
+ var origmacvtapNetworks;
+ var origovsNetworks;
var templateDiskSize;
var baseImageTemplate;
+ var s390xArch = 's390x';
+
$('#template-name', templateEditMain).val(kimchi.selectedTemplate);
$('#edit-template-tabs a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
$('.tab-content').css('overflow', 'hidden');
@@ -47,6 +52,7 @@ kimchi.template_edit_main = function() {
var initTemplate = function(template) {
origDisks = template.disks;
origNetworks = template.networks;
+ origInterfaces = template.interfaces;
for (var i = 0; i < template.disks.length; i++) {
if (template.disks[i].base) {
template["vm-image"] = template.disks[i].base;
@@ -268,10 +274,170 @@ kimchi.template_edit_main = function() {
});
};
- var initProcessor = function() {
- var setCPUValue = function() {
- if (!$('#cores').hasClass("invalid-field") && $('#cores').val() != "") {
- var computedCpu = parseInt($("#cores").val()) * parseInt($("#threads").val());
+ var initInterface_s390x = function(result) {
+ $('#form-template-interface-s390x').show();
+ $('#form-template-interface').hide();
+ var networkItemNum = 0;
+ var addInterfaceItem = function(networkData) {
+ var networkName = networkData.networkV;
+ var nodeInterface = $.parseHTML(wok.substitute($('#template-interface-s390x-tmpl').html(), networkData));
+ $('.template-tab-body', '#form-template-interface-s390x').append(nodeInterface);
+ $('.delete', '#form-template-interface-s390x').on("click", function(event) {
+ event.preventDefault();
+ $(this).parent().parent().remove();
+ });
+
+ //initialize type option
+ var typeOptionsdata = {};
+ var typeOptions = '';
+ typeOptionsdata.macvtap = 'macvtap';
+ typeOptionsdata.ovs = 'ovs';
+ typeOptionsdata.network = 'network';
+
+ $.each(typeOptionsdata, function(key, value) {
+ if (value === networkData.type) {
+ typeOptions += '<option value="' + key + '" selected="selected">' + networkData.type + '</option>';
+ } else {
+ typeOptions += '<option value="' + key + '">' + value + '</option>';
+ }
+ });
+
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.type').append(typeOptions);
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.type').on('change', function() {
+ var itemNode = $(this).closest('div.item');
+
+ switch ($(this).val()) {
+ case 'macvtap':
+ $('span.mode .label-mode', itemNode).addClass('hide');
+ $('span.mode .bootstrap-select', itemNode).toggleClass("hide", false);
+
+ var networkOptions = '';
+ for (var i = 0; i < origmacvtapNetworks.length; i++) {
+ networkOptions += '<option>' + origmacvtapNetworks[i].name + '</option>';
+ }
+
+ $('span.network select', itemNode).empty().append(networkOptions);
+ $('span.network select', itemNode).selectpicker('refresh');
+
+ break;
+ case 'ovs':
+ $('span.mode .label-mode', itemNode).removeClass('hide');
+ $('span.mode .bootstrap-select', itemNode).toggleClass("hide", true);
+ var networkOptions = '';
+ for (var i = 0; i < origovsNetworks.length; i++) {
+ networkOptions += '<option>' + origovsNetworks[i] + '</option>';
+ }
+
+ $('span.network select', itemNode).empty().append(networkOptions);
+ $('span.network select', itemNode).selectpicker('refresh');
+
+ break;
+ case 'network':
+ $('span.mode .label-mode', itemNode).removeClass('hide');
+ $('span.mode .bootstrap-select', itemNode).toggleClass("hide", true);
+
+ var networkOptions = '';
+ for (var i = 0; i < result.length; i++) {
+ if (result[i].state === "active") {
+ networkOptions += '<option>' + result[i].name + '</option>';
+ }
+ }
+ $('span.network select', itemNode).empty().append(networkOptions);
+ $('span.network select', itemNode).selectpicker('refresh');
+ break;
+ }
+ });
+
+ switch (networkData.type) {
+ case 'macvtap':
+ //initialize network option
+ var networkOptions = '';
+ for (var i = 0; i < origmacvtapNetworks.length; i++) {
+ if (networkName === origmacvtapNetworks[i].name) {
+ networkOptions += '<option selected="selected">' + origmacvtapNetworks[i].name + '</option>';
+ }
+ networkOptions += '<option>' + origmacvtapNetworks[i].name + '</option>';
+ }
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.network').append(networkOptions);
+
+ //initialize Mode option for Macvtap
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.mode').val(networkData.mode);
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.mode').selectpicker('refresh');
+
+ $('span.mode .label-mode', nodeInterface).addClass('hide');
+ $('span.mode .bootstrap-select', nodeInterface).removeClass("hide");
+
+ break;
+ case 'ovs':
+ var networkOptions = '';
+ for (var i = 0; i < origovsNetworks.length; i++) {
+ if (networkName === origovsNetworks[i]) {
+ networkOptions += '<option selected="selected">' + origovsNetworks[i] + '</option>';
+ }
+ networkOptions += '<option>' + origovsNetworks[i] + '</option>';
+ }
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.network').append(networkOptions);
+
+ //initialize Mode option for ovs
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.mode').selectpicker('refresh');
+ $('span.mode .label-mode', nodeInterface).removeClass('hide');
+ $('span.mode .bootstrap-select', nodeInterface).addClass("hide");
+ break;
+ case 'network':
+ var networkOptions = '';
+ for (var i = 0; i < result.length; i++) {
+ if (networkName === result[i].name) {
+ networkOptions += '<option selected="selected">' + result[i].name + '</option>';
+ }
+ if (result[i].state === "active" && networkName !== result[i].name) {
+ networkOptions += '<option>' + result[i].name + '</option>';
+ }
+ }
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.network').append(networkOptions);
+
+ //initialize Mode option for Network
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.mode').selectpicker('refresh');
+ $('span.mode .label-mode', nodeInterface).removeClass('hide');
+ $('span.mode .bootstrap-select', nodeInterface).addClass("hide");
+ break;
+ }
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum).selectpicker();
+ networkItemNum += 1;
+ };
+ if (origInterfaces && origInterfaces.length > 0) {
+ for (var i = 0; i < origInterfaces.length; i++) {
+ addInterfaceItem({
+ networkID: 'networkID' + networkItemNum,
+ networkV: origInterfaces[i].name,
+ type: origInterfaces[i].type,
+ mode: origInterfaces[i].mode
+ });
+ }
+ }
+ if (result && result.length > 0) {
+ for (var i = 0; i < origNetworks.length; i++) {
+ addInterfaceItem({
+ networkID: 'networkID' + networkItemNum,
+ networkV: origNetworks[i],
+ type: 'network'
+ });
+ }
+ }
+ $('#template-edit-interface-add-button-s390x').on("click", function(event) {
+ event.preventDefault();
+ addInterfaceItem({
+ networkID: 'networkID' + networkItemNum,
+ networkV: 'default',
+ type: 'network',
+ mode: 'None'
+ });
+ });
+ };
+
+ var initProcessor = function(){
+ var setCPUValue = function(){
+ if(!$('#cores').hasClass("invalid-field")&&$('#cores').val()!=""){
+ var computedCpu = parseInt($("#cores").val())*parseInt($("#threads").val());
$("#vcpus").val(computedCpu);
if ($("#cpus-check").prop("checked")) {
//If topology is checked, set maxcpu to be the same as # of cpu otherwise, backend gives error
@@ -340,11 +506,23 @@ kimchi.template_edit_main = function() {
});
}
- kimchi.listNetworks(initInterface);
+ if(kimchi.hostarch === s390xArch){
+ kimchi.listmacvtapNetworks(function(macvtapnet){
+ origmacvtapNetworks = macvtapnet;
+ kimchi.listovsNetworks(function(ovsnet){
+ origovsNetworks = ovsnet;
+ kimchi.listNetworks(initInterface_s390x);
+ });
+ });
+ }else {
+ kimchi.listNetworks(initInterface);
+ }
+
kimchi.listStoragePools(initStorage);
initProcessor();
checkInvalids();
};
+
kimchi.retrieveTemplate(kimchi.selectedTemplate, initTemplate);
$('#tmpl-edit-button-save').on('click', function() {
@@ -432,18 +610,65 @@ kimchi.template_edit_main = function() {
topology: {}
};
}
- var networks = $('.template-tab-body .item', '#form-template-interface');
- var networkForUpdate = new Array();
- $.each(networks, function(index, networkEntities) {
- var thisValue = $('select', networkEntities).val();
- networkForUpdate.push(thisValue);
+
+ if(kimchi.hostarch === s390xArch){
+ var interfaces = $('.template-tab-body .item', '#form-template-interface-s390x');
+ var networkForUpdate = new Array();
+ var interfacceForUpdate = new Array();
+
+ $.each(interfaces, function(index, interfaceEntities) {
+ var fields = $('span.type select', interfaceEntities);
+ switch(fields.val()){
+ case 'network':
+ var thisValue = $('span.network select', interfaceEntities).val();
+ networkForUpdate.push(thisValue);
+ break;
+ case 'macvtap':
+ var thisdata = {};
+ thisdata.type = $('span.type select', interfaceEntities).val();
+ thisdata.name = $('span.network select', interfaceEntities).val();
+ thisdata.mode = $('span.mode select', interfaceEntities).val();
+ interfacceForUpdate.push(thisdata);
+ break;
+ case 'ovs':
+ var thisdata = {};
+ thisdata.type = $('span.type select', interfaceEntities).val();
+ thisdata.name = $('span.network select', interfaceEntities).val();
+ interfacceForUpdate.push(thisdata);
+ break;
+ }
+
+ if (networkForUpdate instanceof Array) {
+ data.networks = networkForUpdate;
+ } else if (networkForUpdate != null) {
+ data.networks = [networkForUpdate];
+ } else {
+ data.networks = [];
+ }
+
+ if (networkForUpdate instanceof Array) {
+ data.interfaces = interfacceForUpdate;
+ } else if (interfacceForUpdate != null) {
+ data.interfaces = [interfacceForUpdate];
+ } else {
+ data.interfaces = [];
+ }
});
- if (networkForUpdate instanceof Array) {
- data.networks = networkForUpdate;
- } else if (networkForUpdate != null) {
- data.networks = [networkForUpdate];
- } else {
- data.networks = [];
+ }else {
+ var networks = $('.template-tab-body .item', '#form-template-interface');
+ var networkForUpdate = new Array();
+ $.each(networks, function(index, networkEntities) {
+ var thisValue = $('select', networkEntities).val();
+ networkForUpdate.push(thisValue);
+ });
+
+ if (networkForUpdate instanceof Array) {
+ data.networks = networkForUpdate;
+ } else if (networkForUpdate != null) {
+ data.networks = [networkForUpdate];
+ } else {
+ data.networks = [];
+ }
}
if ($('.has-error', '#form-template-storage').length) {
diff --git a/ui/pages/template-edit.html.tmpl b/ui/pages/template-edit.html.tmpl
index 6cac885..8591561 100644
--- a/ui/pages/template-edit.html.tmpl
+++ b/ui/pages/template-edit.html.tmpl
@@ -129,6 +129,15 @@
</div>
<div class="template-tab-body"></div>
</form>
+ <form id="form-template-interface-s390x" style="display:none">
+ <div class="template-tab-header">
+ <span class="template-interface-cell type">$_("Type")</span>
+ <span class="template-interface-cell network">$_("Network/Interface")</span>
+ <span class="template-interface-cell mode">$_("Mode")</span>
+ <button type="button" id="template-edit-interface-add-button-s390x" class="pull-right btn btn-primary"><i class="fa fa-plus-circle"></i> $_("Add Interface")</button>
+ </div>
+ <div class="template-tab-body"></div>
+ </form>
</div>
<div role="tabpanel" class="tab-pane" id="processor">
<form id="form-template-processor">
@@ -221,5 +230,25 @@
</span>
</div>
</script>
+<script id="template-interface-s390x-tmpl" type="text/html">
+ <div class="item" id={networkID}>
+ <span class="template-interface-cell type">
+ <select></select>
+ </span>
+ <span class="template-interface-cell network">
+ <select></select>
+ </span>
+ <span class="template-interface-cell mode">
+ <span class="label-mode hide">None</span>
+ <select>
+ <option value="bridge">bridge</option>
+ <option value="vepa">vepa</option>
+ </select>
+ </span>
+ <span class="pull-right">
+ <button class="delete btn-primary btn"><i class="fa fa-minus-circle"></i> $_("Delete")</button>
+ </span>
+ </div>
+</script>
</body>
</html>
--
2.7.4
2
1
[PATCH V2] [Kimchi] Introducing Console for edit Guest module under virtualization
by archus@linux.vnet.ibm.com 16 Sep '16
by archus@linux.vnet.ibm.com 16 Sep '16
16 Sep '16
From: Rajat Gupta <rajgupta(a)linux.vnet.ibm.com>
Introducing Console for edit Guest module under virtualization
for s390x
Signed-off-by: Rajat Gupta <rajgupta(a)linux.vnet.ibm.com>
---
ui/js/src/kimchi.guest_edit_main.js | 13 +++++++++++++
ui/pages/guest-edit.html.tmpl | 8 ++++++++
2 files changed, 21 insertions(+)
diff --git a/ui/js/src/kimchi.guest_edit_main.js b/ui/js/src/kimchi.guest_edit_main.js
index cc899ff..c3609c2 100644
--- a/ui/js/src/kimchi.guest_edit_main.js
+++ b/ui/js/src/kimchi.guest_edit_main.js
@@ -1014,6 +1014,19 @@ kimchi.guest_edit_main = function() {
});
}
+ if(kimchi.hostarch === s390xArch){
+ var consoleData = guest.console ? guest.console : '';
+ $('#guest-edit-console').val(consoleData);
+
+ if (kimchi.thisVMState === "shutoff") {
+ $('#guest-edit-console').prop('disabled', false);
+ }else{
+ $('#guest-edit-console').prop('disabled', true);
+ }
+ $('#guest-console-panel').show();
+ $('#guest-edit-console').selectpicker();
+ }
+
var onAttached = function(params) {
refreshCDROMs();
};
diff --git a/ui/pages/guest-edit.html.tmpl b/ui/pages/guest-edit.html.tmpl
index 3a575dc..88ccb10 100644
--- a/ui/pages/guest-edit.html.tmpl
+++ b/ui/pages/guest-edit.html.tmpl
@@ -71,6 +71,14 @@
<label for="guest-edit-icon-textbox">$_("Icon")</label>
<input id="guest-edit-icon-textbox" class="form-control" name="icon" type="text" disabled="disabled" />
</div>
+ <div class="form-group" id="guest-console-panel" style="display:none;">
+ <label for="guest-edit-console">$_("Console")</label>
+ <select id="guest-edit-console" name="console" class="form-control">
+ <option value=""></option>
+ <option value="sclp">$_("sclp")</option>
+ <option value="virtio">$_("virtio")</option>
+ </select>
+ </div>
</form>
<form role="tabpanel" class="tab-pane" id="form-guest-edit-storage">
<div class="btn-group action-area">
--
2.7.4
2
1
[PATCH V2] [Kimchi] Introducing Console for edit template module under virtualization
by rajgupta@linux.vnet.ibm.com 15 Sep '16
by rajgupta@linux.vnet.ibm.com 15 Sep '16
15 Sep '16
From: Rajat Gupta <rajgupta(a)linux.vnet.ibm.com>
V2 :
Corrected Indentation
V1 :
Introducing Console for edit template module under virtualization
Note: This patch is dependent on following subjected patches
1.Introducing s390x UI Interfaces module for Edit Template under virtualization
2.Introducing s390x UI Interfaces module for Edit Guest under virtualization
3.Introducing s390x UI Storage module for Edit Template under virtualization
4.Introducing s390x UI Storage module for Edit Guest under virtualization
Signed-off-by: Rajat Gupta <rajgupta(a)linux.vnet.ibm.com>
---
ui/js/src/kimchi.template_edit_main.js | 13 ++++++++++++-
ui/pages/template-edit.html.tmpl | 10 ++++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/ui/js/src/kimchi.template_edit_main.js b/ui/js/src/kimchi.template_edit_main.js
index a2032cc..466ae70 100644
--- a/ui/js/src/kimchi.template_edit_main.js
+++ b/ui/js/src/kimchi.template_edit_main.js
@@ -62,6 +62,12 @@ kimchi.template_edit_main = function() {
}
$('input[name="' + prop + '"]', templateEditMain).val(value);
}
+ if(kimchi.hostarch == s390xArch){
+ $('.console', templateEditMain).show();
+ var consoleData = template.console ? template.console : '';
+ $('#template-edit-console', templateEditMain).val(consoleData);
+ $('#template-edit-console').selectpicker();
+ }
$('#template-edit-memory-textbox').val(template.memory.current);
$('#template-edit-max-memory-textbox').val(template.memory.maxmemory);
@@ -356,7 +362,12 @@ kimchi.template_edit_main = function() {
$('.modal input[type="checkbox"]').prop('disabled', true);
$('.modal select').prop('disabled', true);
$('.modal .selectpicker').addClass('disabled');
- var editableFields = ['name', 'memory', 'graphics', 'max-memory'];
+ if(kimchi.hostarch === s390xArch){
+ var editableFields = ['name', 'memory', 'graphics', 'max-memory', 'console'];
+ }else {
+ var editableFields = ['name', 'memory', 'graphics', 'max-memory'];
+ }
+
var data = {};
var disks = $('.template-tab-body .item', '#form-template-storage');
var disksForUpdate = new Array();
diff --git a/ui/pages/template-edit.html.tmpl b/ui/pages/template-edit.html.tmpl
index 6cac885..14f6cfa 100644
--- a/ui/pages/template-edit.html.tmpl
+++ b/ui/pages/template-edit.html.tmpl
@@ -73,6 +73,9 @@
<div class="template-edit-wrapper-label">
<label>$_("Graphics")</label>
</div>
+ <div class="template-edit-wrapper-label console" style="display:none">
+ <label>$_("Console")</label>
+ </div>
</div>
<div class="form-template-inline-wrapper">
<div class="template-edit-wrapper-controls">
@@ -104,6 +107,13 @@
<div class="template-edit-wrapper-controls">
<select id="template-edit-graphics" name="graphics" class="form-control" />
</div>
+ <div class="template-edit-wrapper-controls console" style="display:none">
+ <select id="template-edit-console" name="console" class="form-control">
+ <option value=""></option>
+ <option value="sclp">$_("sclp")</option>
+ <option value="virtio">$_("virtio")</option>
+ </select>
+ </div>
</div>
</form>
</div>
--
2.1.0
2
1
[PATCH v3] [Kimchi 0/2] added 'console' parameter for templates & vms api for s390x
by sureshab@linux.vnet.ibm.com 15 Sep '16
by sureshab@linux.vnet.ibm.com 15 Sep '16
15 Sep '16
From: Suresh Babu Angadi <sureshab(a)in.ibm.com>
v2-v3: resolved merge conflict
v1-v2: provided detailed commit message and reduced number of patches
In case of s390x architecture, console type can be
either virtio/sclp. Extended current code to support
console configuration in case of s390x
this patch set provides option to configure 'console'
parameter for templates and vms api when running on
's390x' architecture
Suresh Babu Angadi (2):
added 'console' parameter to templates api for s390x
added 'console' parameter to vms api for s390x
API.json | 24 ++++++++++++++---
control/templates.py | 1 +
i18n.py | 4 +++
model/templates.py | 6 +++++
model/vms.py | 75 +++++++++++++++++++++++++++++++++++-----------------
osinfo.py | 4 +++
xmlutils/serial.py | 5 +++-
7 files changed, 91 insertions(+), 28 deletions(-)
--
2.1.0
2
3
[PATCH v2] [Kimchi 0/2] added 'console' parameter for templates & vms api for s390x
by sureshab@linux.vnet.ibm.com 15 Sep '16
by sureshab@linux.vnet.ibm.com 15 Sep '16
15 Sep '16
From: Suresh Babu Angadi <sureshab(a)in.ibm.com>
v1-v2: provided detailed commit message and reduced number of patches
In case of s390x architecture, console type can be
either virtio/sclp. Extended current code to support
console configuration in case of s390x
this patch set provides option to configure 'console'
parameter for templates and vms api when running on
's390x' architecture
Suresh Babu Angadi (2):
added 'console' parameter to templates api for s390x
added 'console' parameter to vms api for s390x
API.json | 24 ++++++++++++++---
control/templates.py | 1 +
i18n.py | 4 +++
model/templates.py | 6 +++++
model/vms.py | 75 +++++++++++++++++++++++++++++++++++-----------------
osinfo.py | 4 +++
xmlutils/serial.py | 5 +++-
7 files changed, 91 insertions(+), 28 deletions(-)
--
2.1.0
4
9
[PATCH] [Kimchi] Introducing Console for edit Guest module under virtualization
by rajgupta@linux.vnet.ibm.com 15 Sep '16
by rajgupta@linux.vnet.ibm.com 15 Sep '16
15 Sep '16
From: Rajat Gupta <rajgupta(a)linux.vnet.ibm.com>
Introducing Console for edit Guest module under virtualization
for s390x
Signed-off-by: Rajat Gupta <rajgupta(a)linux.vnet.ibm.com>
---
ui/js/src/kimchi.guest_edit_main.js | 13 +++++++++++++
ui/pages/guest-edit.html.tmpl | 8 ++++++++
2 files changed, 21 insertions(+)
diff --git a/ui/js/src/kimchi.guest_edit_main.js b/ui/js/src/kimchi.guest_edit_main.js
index dcaafb8..e2437d7 100644
--- a/ui/js/src/kimchi.guest_edit_main.js
+++ b/ui/js/src/kimchi.guest_edit_main.js
@@ -776,6 +776,19 @@ kimchi.guest_edit_main = function() {
});
}
+ if(kimchi.hostarch === s390xArch){
+ var consoleData = guest.console ? guest.console : '';
+ $('#guest-edit-console').val(consoleData);
+
+ if (kimchi.thisVMState === "shutoff") {
+ $('#guest-edit-console').prop('disabled', false);
+ }else{
+ $('#guest-edit-console').prop('disabled', true);
+ }
+ $('#guest-console-panel').show();
+ $('#guest-edit-console').selectpicker();
+ }
+
var onAttached = function(params) {
refreshCDROMs();
};
diff --git a/ui/pages/guest-edit.html.tmpl b/ui/pages/guest-edit.html.tmpl
index a9a468e..ac6a57e 100644
--- a/ui/pages/guest-edit.html.tmpl
+++ b/ui/pages/guest-edit.html.tmpl
@@ -71,6 +71,14 @@
<label for="guest-edit-icon-textbox">$_("Icon")</label>
<input id="guest-edit-icon-textbox" class="form-control" name="icon" type="text" disabled="disabled" />
</div>
+ <div class="form-group" id="guest-console-panel" style="display:none;">
+ <label for="guest-edit-console">$_("Console")</label>
+ <select id="guest-edit-console" name="console" class="form-control">
+ <option value=""></option>
+ <option value="sclp">$_("sclp")</option>
+ <option value="virtio">$_("virtio")</option>
+ </select>
+ </div>
</form>
<form role="tabpanel" class="tab-pane" id="form-guest-edit-storage">
<div class="btn-group action-area">
--
2.1.0
4
5
[PATCH V2] [Kimchi] Introducing s390x UI Interfaces module for Edit Template under virtualization
by rajgupta@linux.vnet.ibm.com 15 Sep '16
by rajgupta@linux.vnet.ibm.com 15 Sep '16
15 Sep '16
From: Rajat Gupta <rajgupta(a)linux.vnet.ibm.com>
Introducing s390x UI Interfaces module for Edit Template under virtualization
Signed-off-by: Rajat Gupta <rajgupta(a)linux.vnet.ibm.com>
---
ui/js/src/kimchi.api.js | 44 ++++++
ui/js/src/kimchi.main.js | 5 +
ui/js/src/kimchi.template_edit_main.js | 257 +++++++++++++++++++++++++++++++--
ui/pages/template-edit.html.tmpl | 29 ++++
4 files changed, 319 insertions(+), 16 deletions(-)
diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js
index 2f127aa..950ca00 100644
--- a/ui/js/src/kimchi.api.js
+++ b/ui/js/src/kimchi.api.js
@@ -596,6 +596,34 @@ var kimchi = {
});
},
+ listmacvtapNetworks: function(suc, err) {
+ wok.requestJSON({
+ url: 'plugins/kimchi/interfaces?type=^nic|bonding|vlan$',
+ type: 'GET',
+ contentType: 'application/json',
+ dataType: 'json',
+ resend: true,
+ success: suc,
+ error: err ? err : function(data) {
+ wok.message.error(data.responseJSON.reason);
+ }
+ });
+ },
+
+ listovsNetworks: function(suc, err) {
+ wok.requestJSON({
+ url: 'plugins/kimchi/ovsbridges',
+ type: 'GET',
+ contentType: 'application/json',
+ dataType: 'json',
+ resend: true,
+ success: suc,
+ error: err ? err : function(data) {
+ wok.message.error(data.responseJSON.reason);
+ }
+ });
+ },
+
toggleNetwork : function(name, on, suc, err) {
var action = on ? "activate" : "deactivate";
wok.requestJSON({
@@ -1271,3 +1299,19 @@ var kimchi = {
});
}
};
+
+ /**
+ * Get the host information.
+ */
+
+ kimchi.getHostDetails = function(suc, err) {
+ wok.requestJSON({
+ url: 'plugins/gingerbase/host',
+ type: 'GET',
+ resend: true,
+ contentType: 'application/json',
+ dataType: 'json',
+ success: suc,
+ error: err
+ });
+ }
diff --git a/ui/js/src/kimchi.main.js b/ui/js/src/kimchi.main.js
index b6de2cf..f3078ec 100644
--- a/ui/js/src/kimchi.main.js
+++ b/ui/js/src/kimchi.main.js
@@ -33,6 +33,11 @@ kimchi.getCapabilities(function(result) {
kimchi.capabilities = {};
});
+kimchi.hostarch = undefined;
+kimchi.getHostDetails(function(result) {
+ kimchi.hostarch = result["architecture"];
+});
+
$(function(){
$('body').removeClass('wok-list wok-gallery');
});
diff --git a/ui/js/src/kimchi.template_edit_main.js b/ui/js/src/kimchi.template_edit_main.js
index a2032cc..9ccf9cc 100644
--- a/ui/js/src/kimchi.template_edit_main.js
+++ b/ui/js/src/kimchi.template_edit_main.js
@@ -19,8 +19,13 @@ kimchi.template_edit_main = function() {
var templateEditMain = $('#edit-template-tabs');
var origDisks;
var origNetworks;
+ var origInterfaces;
+ var origmacvtapNetworks;
+ var origovsNetworks;
var templateDiskSize;
var baseImageTemplate;
+ var s390xArch = 's390x';
+
$('#template-name', templateEditMain).val(kimchi.selectedTemplate);
$('#edit-template-tabs a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
$('.tab-content').css('overflow', 'hidden');
@@ -47,6 +52,7 @@ kimchi.template_edit_main = function() {
var initTemplate = function(template) {
origDisks = template.disks;
origNetworks = template.networks;
+ origInterfaces = template.interfaces;
for (var i = 0; i < template.disks.length; i++) {
if (template.disks[i].base) {
template["vm-image"] = template.disks[i].base;
@@ -268,10 +274,170 @@ kimchi.template_edit_main = function() {
});
};
- var initProcessor = function() {
- var setCPUValue = function() {
- if (!$('#cores').hasClass("invalid-field") && $('#cores').val() != "") {
- var computedCpu = parseInt($("#cores").val()) * parseInt($("#threads").val());
+ var initInterface_s390x = function(result) {
+ $('#form-template-interface-s390x').show();
+ $('#form-template-interface').hide();
+ var networkItemNum = 0;
+ var addInterfaceItem = function(networkData) {
+ var networkName = networkData.networkV;
+ var nodeInterface = $.parseHTML(wok.substitute($('#template-interface-s390x-tmpl').html(), networkData));
+ $('.template-tab-body', '#form-template-interface-s390x').append(nodeInterface);
+ $('.delete', '#form-template-interface-s390x').on("click", function(event) {
+ event.preventDefault();
+ $(this).parent().parent().remove();
+ });
+
+ //initialize type option
+ var typeOptionsdata = {};
+ var typeOptions = '';
+ typeOptionsdata.macvtap = 'macvtap';
+ typeOptionsdata.ovs = 'ovs';
+ typeOptionsdata.network = 'network';
+
+ $.each(typeOptionsdata, function(key, value) {
+ if (value === networkData.type) {
+ typeOptions += '<option value="' + key + '" selected="selected">' + networkData.type + '</option>';
+ } else {
+ typeOptions += '<option value="' + key + '">' + value + '</option>';
+ }
+ });
+
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.type').append(typeOptions);
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.type').on('change', function() {
+ var itemNode = $(this).closest('div.item');
+
+ switch ($(this).val()) {
+ case 'macvtap':
+ $('span.mode .label-mode', itemNode).addClass('hide');
+ $('span.mode .bootstrap-select', itemNode).toggleClass("hide", false);
+
+ var networkOptions = '';
+ for (var i = 0; i < origmacvtapNetworks.length; i++) {
+ networkOptions += '<option>' + origmacvtapNetworks[i].name + '</option>';
+ }
+
+ $('span.network select', itemNode).empty().append(networkOptions);
+ $('span.network select', itemNode).selectpicker('refresh');
+
+ break;
+ case 'ovs':
+ $('span.mode .label-mode', itemNode).removeClass('hide');
+ $('span.mode .bootstrap-select', itemNode).toggleClass("hide", true);
+ var networkOptions = '';
+ for (var i = 0; i < origovsNetworks.length; i++) {
+ networkOptions += '<option>' + origovsNetworks[i] + '</option>';
+ }
+
+ $('span.network select', itemNode).empty().append(networkOptions);
+ $('span.network select', itemNode).selectpicker('refresh');
+
+ break;
+ case 'network':
+ $('span.mode .label-mode', itemNode).removeClass('hide');
+ $('span.mode .bootstrap-select', itemNode).toggleClass("hide", true);
+
+ var networkOptions = '';
+ for (var i = 0; i < result.length; i++) {
+ if (result[i].state === "active") {
+ networkOptions += '<option>' + result[i].name + '</option>';
+ }
+ }
+ $('span.network select', itemNode).empty().append(networkOptions);
+ $('span.network select', itemNode).selectpicker('refresh');
+ break;
+ }
+ });
+
+ switch (networkData.type) {
+ case 'macvtap':
+ //initialize network option
+ var networkOptions = '';
+ for (var i = 0; i < origmacvtapNetworks.length; i++) {
+ if (networkName === origmacvtapNetworks[i].name) {
+ networkOptions += '<option selected="selected">' + origmacvtapNetworks[i].name + '</option>';
+ }
+ networkOptions += '<option>' + origmacvtapNetworks[i].name + '</option>';
+ }
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.network').append(networkOptions);
+
+ //initialize Mode option for Macvtap
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.mode').val(networkData.mode);
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.mode').selectpicker('refresh');
+
+ $('span.mode .label-mode', nodeInterface).addClass('hide');
+ $('span.mode .bootstrap-select', nodeInterface).removeClass("hide");
+
+ break;
+ case 'ovs':
+ var networkOptions = '';
+ for (var i = 0; i < origovsNetworks.length; i++) {
+ if (networkName === origovsNetworks[i]) {
+ networkOptions += '<option selected="selected">' + origovsNetworks[i] + '</option>';
+ }
+ networkOptions += '<option>' + origovsNetworks[i] + '</option>';
+ }
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.network').append(networkOptions);
+
+ //initialize Mode option for ovs
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.mode').selectpicker('refresh');
+ $('span.mode .label-mode', nodeInterface).removeClass('hide');
+ $('span.mode .bootstrap-select', nodeInterface).addClass("hide");
+ break;
+ case 'network':
+ var networkOptions = '';
+ for (var i = 0; i < result.length; i++) {
+ if (networkName === result[i].name) {
+ networkOptions += '<option selected="selected">' + result[i].name + '</option>';
+ }
+ if (result[i].state === "active" && networkName !== result[i].name) {
+ networkOptions += '<option>' + result[i].name + '</option>';
+ }
+ }
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.network').append(networkOptions);
+
+ //initialize Mode option for Network
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum + ' span.mode').selectpicker('refresh');
+ $('span.mode .label-mode', nodeInterface).removeClass('hide');
+ $('span.mode .bootstrap-select', nodeInterface).addClass("hide");
+ break;
+ }
+ $('select', '#form-template-interface-s390x #networkID' + networkItemNum).selectpicker();
+ networkItemNum += 1;
+ };
+ if (origInterfaces && origInterfaces.length > 0) {
+ for (var i = 0; i < origInterfaces.length; i++) {
+ addInterfaceItem({
+ networkID: 'networkID' + networkItemNum,
+ networkV: origInterfaces[i].name,
+ type: origInterfaces[i].type,
+ mode: origInterfaces[i].mode
+ });
+ }
+ }
+ if (result && result.length > 0) {
+ for (var i = 0; i < origNetworks.length; i++) {
+ addInterfaceItem({
+ networkID: 'networkID' + networkItemNum,
+ networkV: origNetworks[i],
+ type: 'network'
+ });
+ }
+ }
+ $('#template-edit-interface-add-button-s390x').on("click", function(event) {
+ event.preventDefault();
+ addInterfaceItem({
+ networkID: 'networkID' + networkItemNum,
+ networkV: 'default',
+ type: 'network',
+ mode: 'None'
+ });
+ });
+ };
+
+ var initProcessor = function(){
+ var setCPUValue = function(){
+ if(!$('#cores').hasClass("invalid-field")&&$('#cores').val()!=""){
+ var computedCpu = parseInt($("#cores").val())*parseInt($("#threads").val());
$("#vcpus").val(computedCpu);
if ($("#cpus-check").prop("checked")) {
//If topology is checked, set maxcpu to be the same as # of cpu otherwise, backend gives error
@@ -340,11 +506,23 @@ kimchi.template_edit_main = function() {
});
}
- kimchi.listNetworks(initInterface);
+ if(kimchi.hostarch === s390xArch){
+ kimchi.listmacvtapNetworks(function(macvtapnet){
+ origmacvtapNetworks = macvtapnet;
+ kimchi.listovsNetworks(function(ovsnet){
+ origovsNetworks = ovsnet;
+ kimchi.listNetworks(initInterface_s390x);
+ });
+ });
+ }else {
+ kimchi.listNetworks(initInterface);
+ }
+
kimchi.listStoragePools(initStorage);
initProcessor();
checkInvalids();
};
+
kimchi.retrieveTemplate(kimchi.selectedTemplate, initTemplate);
$('#tmpl-edit-button-save').on('click', function() {
@@ -432,18 +610,65 @@ kimchi.template_edit_main = function() {
topology: {}
};
}
- var networks = $('.template-tab-body .item', '#form-template-interface');
- var networkForUpdate = new Array();
- $.each(networks, function(index, networkEntities) {
- var thisValue = $('select', networkEntities).val();
- networkForUpdate.push(thisValue);
+
+ if(kimchi.hostarch === s390xArch){
+ var interfaces = $('.template-tab-body .item', '#form-template-interface-s390x');
+ var networkForUpdate = new Array();
+ var interfacceForUpdate = new Array();
+
+ $.each(interfaces, function(index, interfaceEntities) {
+ var fields = $('span.type select', interfaceEntities);
+ switch(fields.val()){
+ case 'network':
+ var thisValue = $('span.network select', interfaceEntities).val();
+ networkForUpdate.push(thisValue);
+ break;
+ case 'macvtap':
+ var thisdata = {};
+ thisdata.type = $('span.type select', interfaceEntities).val();
+ thisdata.name = $('span.network select', interfaceEntities).val();
+ thisdata.mode = $('span.mode select', interfaceEntities).val();
+ interfacceForUpdate.push(thisdata);
+ break;
+ case 'ovs':
+ var thisdata = {};
+ thisdata.type = $('span.type select', interfaceEntities).val();
+ thisdata.name = $('span.network select', interfaceEntities).val();
+ interfacceForUpdate.push(thisdata);
+ break;
+ }
+
+ if (networkForUpdate instanceof Array) {
+ data.networks = networkForUpdate;
+ } else if (networkForUpdate != null) {
+ data.networks = [networkForUpdate];
+ } else {
+ data.networks = [];
+ }
+
+ if (networkForUpdate instanceof Array) {
+ data.interfaces = interfacceForUpdate;
+ } else if (interfacceForUpdate != null) {
+ data.interfaces = [interfacceForUpdate];
+ } else {
+ data.interfaces = [];
+ }
});
- if (networkForUpdate instanceof Array) {
- data.networks = networkForUpdate;
- } else if (networkForUpdate != null) {
- data.networks = [networkForUpdate];
- } else {
- data.networks = [];
+ }else {
+ var networks = $('.template-tab-body .item', '#form-template-interface');
+ var networkForUpdate = new Array();
+ $.each(networks, function(index, networkEntities) {
+ var thisValue = $('select', networkEntities).val();
+ networkForUpdate.push(thisValue);
+ });
+
+ if (networkForUpdate instanceof Array) {
+ data.networks = networkForUpdate;
+ } else if (networkForUpdate != null) {
+ data.networks = [networkForUpdate];
+ } else {
+ data.networks = [];
+ }
}
if ($('.has-error', '#form-template-storage').length) {
diff --git a/ui/pages/template-edit.html.tmpl b/ui/pages/template-edit.html.tmpl
index 6cac885..8591561 100644
--- a/ui/pages/template-edit.html.tmpl
+++ b/ui/pages/template-edit.html.tmpl
@@ -129,6 +129,15 @@
</div>
<div class="template-tab-body"></div>
</form>
+ <form id="form-template-interface-s390x" style="display:none">
+ <div class="template-tab-header">
+ <span class="template-interface-cell type">$_("Type")</span>
+ <span class="template-interface-cell network">$_("Network/Interface")</span>
+ <span class="template-interface-cell mode">$_("Mode")</span>
+ <button type="button" id="template-edit-interface-add-button-s390x" class="pull-right btn btn-primary"><i class="fa fa-plus-circle"></i> $_("Add Interface")</button>
+ </div>
+ <div class="template-tab-body"></div>
+ </form>
</div>
<div role="tabpanel" class="tab-pane" id="processor">
<form id="form-template-processor">
@@ -221,5 +230,25 @@
</span>
</div>
</script>
+<script id="template-interface-s390x-tmpl" type="text/html">
+ <div class="item" id={networkID}>
+ <span class="template-interface-cell type">
+ <select></select>
+ </span>
+ <span class="template-interface-cell network">
+ <select></select>
+ </span>
+ <span class="template-interface-cell mode">
+ <span class="label-mode hide">None</span>
+ <select>
+ <option value="bridge">bridge</option>
+ <option value="vepa">vepa</option>
+ </select>
+ </span>
+ <span class="pull-right">
+ <button class="delete btn-primary btn"><i class="fa fa-minus-circle"></i> $_("Delete")</button>
+ </span>
+ </div>
+</script>
</body>
</html>
--
2.1.0
3
4
[PATCH V2] [Kimchi] Introducing s390x UI Storage module for Edit Guest under virtualization
by rajgupta@linux.vnet.ibm.com 15 Sep '16
by rajgupta@linux.vnet.ibm.com 15 Sep '16
15 Sep '16
From: Rajat Gupta <rajgupta(a)linux.vnet.ibm.com>
V2 :
Corrected Indentation
V1 :
Introducing s390x UI Storage module for Edit Guest under virtualization
Note: This patch is dependent on following subjected patches
1.Introducing s390x UI Interfaces module for Edit Template under virtualization
2.Introducing s390x UI Interfaces module for Edit Guest under virtualization
3.Introducing s390x UI Storage module for Edit Template under virtualization
ui/js/src/kimchi.guest_storage_add.main.js | 165 ++++++++++++++++++++++++-----
ui/pages/guest-storage-add.html.tmpl | 26 ++++-
2 files changed, 163 insertions(+), 28 deletions(-)
diff --git a/ui/js/src/kimchi.guest_storage_add.main.js b/ui/js/src/kimchi.guest_storage_add.main.js
index 29fccab..08e71db 100644
--- a/ui/js/src/kimchi.guest_storage_add.main.js
+++ b/ui/js/src/kimchi.guest_storage_add.main.js
@@ -60,11 +60,23 @@ kimchi.guest_storage_add_main = function() {
value: 'disk'
}];
+ var source = [{
+ label: 'Pool',
+ value: 'pool'
+ },{
+ label: 'Path',
+ value: 'path'
+ }];
+
var storageAddForm = $('#form-guest-storage-add');
var submitButton = $('#guest-storage-button-add');
var typeTextbox = $('select#guest-storage-type', storageAddForm);
var pathTextbox = $('input[name="path"]', storageAddForm);
var poolTextbox = $('select#guest-disk-pool', storageAddForm);
+ var sourceTextbox = $('select#guest-disk-source', storageAddForm);
+ var sourcenewTextbox = $('select#guest-disk-source-new', storageAddForm);
+ var directorypathTextbox = $('#directorypath', storageAddForm);
+ var diskpathTextbox = $('#diskpath', storageAddForm);
var volTextbox = $('select#guest-disk-vol', storageAddForm);
var newPoolTextbox = $('select#guest-disk-pool-new', storageAddForm);
var capacityTextbox = $('input[name="capacity"]', storageAddForm);
@@ -73,6 +85,7 @@ kimchi.guest_storage_add_main = function() {
var selectStoragePoolHTML = '';
var selectStorageVolHTML = '';
var rbExisting = 'false';
+ var s390xArch = 's390x';
var getFormatList = function() {
var format = ["qcow", "qcow2", "qed", "raw", "vmdk", "vpc"];
@@ -177,6 +190,45 @@ kimchi.guest_storage_add_main = function() {
//First time retrieving list of Storage Pools - defaulting to new disk
getStoragePools('new');
+ if(kimchi.hostarch === s390xArch){
+ //initialize source dropdown for new disk
+ $('#new-disk-box div.source').show();
+
+ var getStorageSourceNew = function(sourceSelected ) {
+ selectStorageSourceHTML = ''; //reset string
+ $.each(source, function(index, storageSource) {
+ selectStorageSourceHTML += '<option value="'+ storageSource.value + '">' + storageSource.label + '</option>';
+ });
+
+ sourcenewTextbox.empty();
+ sourcenewTextbox.append(selectStorageSourceHTML);
+ sourcenewTextbox.val(sourceSelected);
+ $(sourcenewTextbox).trigger('change');
+ sourcenewTextbox.selectpicker();
+ $('.selectpicker').selectpicker('refresh');
+ };
+
+ getStorageSourceNew('pool');
+
+ //initialize source dropdown for existing disk
+ $('#existing-disk-box div.source').show();
+
+ var getStorageSource = function(sourceSelected ) {
+ selectStorageSourceHTML = ''; //reset string
+ $.each(source, function(index, storageSource) {
+ selectStorageSourceHTML += '<option value="'+ storageSource.value + '">' + storageSource.label + '</option>';
+ });
+
+ sourceTextbox.empty();
+ sourceTextbox.append(selectStorageSourceHTML);
+ sourceTextbox.val(sourceSelected);
+ $(sourceTextbox).trigger('change');
+ sourceTextbox.selectpicker();
+ $('.selectpicker').selectpicker('refresh');
+ };
+ getStorageSource('pool');
+ }
+
poolTextbox.on('change',function() {
var options = [];
selectStorageVolHTML = '';
@@ -214,6 +266,34 @@ kimchi.guest_storage_add_main = function() {
}, null, false);
});
+ if (kimchi.hostarch === s390xArch) {
+ sourcenewTextbox.on('change', function() {
+ switch ($(this).val()) {
+ case 'path':
+ $('#new-disk-box div.pool').hide();
+ $('#new-disk-box div.directorypath').show();
+
+ break;
+ default:
+ $('#new-disk-box div.pool').show();
+ $('#new-disk-box div.directorypath').hide();
+ }
+ });
+
+ sourceTextbox.on('change', function() {
+ switch ($(this).val()) {
+ case 'path':
+ $('#existing-disk-box div.pool,div.volume').hide();
+ $('#existing-disk-box div.diskpath').show();
+
+ break;
+ default:
+ $('#existing-disk-box div.pool,div.volume').show();
+ $('#existing-disk-box div.diskpath').hide();
+ }
+ });
+ }
+
typeTextbox.on('change',function() {
var pathObject = {'cdrom': ".path-section", 'disk': '.volume-section'};
var selectType = $(this).val();
@@ -237,9 +317,12 @@ kimchi.guest_storage_add_main = function() {
$('#existing-disk-box').removeClass('hidden');
$('#new-disk-box').addClass('hidden');
$('#guest-storage-add-window .modal-body .template-pager').animate({
- height: "200px"
+ height: "300px"
}, 300);
getStoragePools('existing');
+ if(kimchi.hostarch === s390xArch){
+ getStorageSource('pool');
+ }
$(pathTextbox).val("");
$(newPoolTextbox).val("");
$(capacityTextbox).val("");
@@ -260,9 +343,17 @@ kimchi.guest_storage_add_main = function() {
currentPage = 'new-disk-box';
$('#existing-disk-box').addClass('hidden');
$('#new-disk-box').removeClass('hidden');
- $('#guest-storage-add-window .modal-body .template-pager').animate({
- height: "300px"
- }, 400);
+
+ if(kimchi.hostarch === s390xArch){
+ getStorageSourceNew('pool');
+ $('#guest-storage-add-window .modal-body .template-pager').animate({
+ height: "400px"
+ }, 400);
+ }else{
+ $('#guest-storage-add-window .modal-body .template-pager').animate({
+ height: "300px"
+ }, 400);
+ }
$(pathTextbox).val("");
$(poolTextbox).val("");
$(volTextbox).val("");
@@ -414,35 +505,59 @@ kimchi.guest_storage_add_main = function() {
}
var formData = storageAddForm.serializeObject();
- var settings = {
- vm: kimchi.selectedGuest,
- type: typeTextbox.val(),
- path: pathTextbox.val(),
- pool: poolTextbox.val(),
- vol: volTextbox.val(),
- newpool: newPoolTextbox.val(),
- format: formatTextbox.val(),
- capacity: capacityTextbox.val()
- };
+ if (kimchi.hostarch === s390xArch && ((sourceTextbox.val() === 'path') || sourcenewTextbox.val() === 'path')) {
+ if ($('#new-disk').prop('checked')) {
+ var settings = {
+ vm: kimchi.selectedGuest,
+ dir_path: directorypathTextbox.val(),
+ name: kimchi.selectedGuest + '_' + $.now() + '.img',
+ size: capacityTextbox.val(),
+ type: typeTextbox.val(),
+ format: formatTextbox.val()
+ };
+ } else if ($('#existing-disk').prop('checked')) {
+ var settings = {
+ vm: kimchi.selectedGuest,
+ path: diskpathTextbox.val(),
+ type: typeTextbox.val(),
+ format: formatTextbox.val()
+ };
+ }
+ } else {
+ var settings = {
+ vm: kimchi.selectedGuest,
+ type: typeTextbox.val(),
+ path: pathTextbox.val(),
+ pool: poolTextbox.val(),
+ vol: volTextbox.val(),
+ newpool: newPoolTextbox.val(),
+ format: formatTextbox.val(),
+ capacity: capacityTextbox.val()
+ };
+ }
$(submitButton).prop('disabled', true);
$.each([pathTextbox, poolTextbox, volTextbox, newPoolTextbox, capacityTextbox, formatTextbox], function(i, c) {
$(c).prop('disabled', true);
});
- // Validate form for cdrom and disk
- validateSpecifiedForm = validator[settings['type']];
- if (!validateSpecifiedForm(settings)) {
- $(submitButton).prop('disabled', false);
- $.each([submitButton, pathTextbox, poolTextbox, volTextbox, newPoolTextbox, capacityTextbox, formatTextbox], function(i, c) {
- $(c).prop('disabled', false);
- });
- return false;
- }
- $(submitButton).addClass('loading').text(i18n['KCHVMCD6003M']);
- if(bNewDisk === 'false'){
+ if (kimchi.hostarch != s390xArch) {
+ // Validate form for cdrom and disk
+ validateSpecifiedForm = validator[settings['type']];
+ if (!validateSpecifiedForm(settings)) {
+ $(submitButton).prop('disabled', false);
+ $.each([submitButton, pathTextbox, poolTextbox, volTextbox, newPoolTextbox, capacityTextbox, formatTextbox], function(i, c) {
+ $(c).prop('disabled', false);
+ });
+ return false;
+ }
+ if(bNewDisk === 'false'){
+ addStorage(settings);
+ }
+ } else {
addStorage(settings);
}
+ $(submitButton).addClass('loading').text(i18n['KCHVMCD6003M']);
event.preventDefault();
};
diff --git a/ui/pages/guest-storage-add.html.tmpl b/ui/pages/guest-storage-add.html.tmpl
index afc72c8..dad3c3b 100644
--- a/ui/pages/guest-storage-add.html.tmpl
+++ b/ui/pages/guest-storage-add.html.tmpl
@@ -53,7 +53,12 @@
</div>
<div class="template-pager">
<div class="page" id="new-disk-box">
- <div class="form-group">
+ <div class="form-group source" style="display:none;">
+ <label>$_("Source")</label>
+ <select id="guest-disk-source-new" class="selectpicker col-md-12 col-lg-12"></select>
+ <p class="help-block"><i class="fa fa-info-circle"></i> $_("Storage based on Libvirt pool or direct block device")</p>
+ </div>
+ <div class="form-group pool">
<label>$_("Storage Pool")</label>
<select id="guest-disk-pool-new" class="selectpicker col-md-12 col-lg-12">
</select>
@@ -70,20 +75,35 @@
</select>
<p class="help-block"><i class="fa fa-info-circle"></i> $_("Format of the new disk to be created")</p>
</div>
+ <div class="form-group directorypath" style="display:none;">
+ <label>$_("Directory Path")</label>
+ <input type="text" class="form-control" name="directorypath" id="directorypath" />
+ <p class="help-block"><i class="fa fa-info-circle"></i> $_("Provide a directory path")</p>
+ </div>
</div>
<div class="page" id="existing-disk-box">
- <div class="form-group">
+ <div class="form-group source" style="display:none;">
+ <label>$_("Source")</label>
+ <select id="guest-disk-source" class="selectpicker col-md-12 col-lg-12"></select>
+ <p class="help-block"><i class="fa fa-info-circle"></i> $_("Storage based on Libvirt pool or direct block device")</p>
+ </div>
+ <div class="form-group pool">
<label>$_("Storage Pool")</label>
<select id="guest-disk-pool" class="selectpicker col-md-12 col-lg-12">
</select>
<p class="help-block"><i class="fa fa-info-circle"></i> $_("Storage pool in which the volume is located in")</p>
</div>
- <div class="form-group">
+ <div class="form-group volume">
<label>$_("Storage Volume")</label>
<select id="guest-disk-vol" class="selectpicker col-md-12 col-lg-12">
</select>
<p class="help-block"><i class="fa fa-info-circle"></i> $_("Storage volume to be attached")</p>
</div>
+ <div class="form-group diskpath" style="display:none;">
+ <label>$_("Disk Path")</label>
+ <input type="text" class="form-control" name="diskpath" id="diskpath" />
+ <p class="help-block"><i class="fa fa-info-circle"></i> $_("Provide a block device")</p>
+ </div>
</div>
</div>
</div>
--
2.1.0
2
1