
This patch is working for add iscsi type in storage pool create page. 1.Add iscsi server to create storage pool page. 2.Add iscsi target to create storage pool page. Signed-off-by: zhoumeina <zhoumein@linux.vnet.ibm.com> --- ui/css/theme-default/form.css | 5 ++ ui/js/src/kimchi.storagepool_add_main.js | 77 +++++++++++++++++++++++++---- ui/js/src/kimchi.utils.js | 5 ++ ui/pages/i18n.html.tmpl | 7 ++- ui/pages/storagepool-add.html.tmpl | 48 +++++++++++++++---- 5 files changed, 119 insertions(+), 23 deletions(-) diff --git a/ui/css/theme-default/form.css b/ui/css/theme-default/form.css index c24b277..28e30a5 100644 --- a/ui/css/theme-default/form.css +++ b/ui/css/theme-default/form.css @@ -45,3 +45,8 @@ line-height: 30px; padding: 0 5px; } + + +.form-section input.invalid-field[type="text"] { + border-color: #FF4444; +} \ No newline at end of file diff --git a/ui/js/src/kimchi.storagepool_add_main.js b/ui/js/src/kimchi.storagepool_add_main.js index a154933..3b9660e 100644 --- a/ui/js/src/kimchi.storagepool_add_main.js +++ b/ui/js/src/kimchi.storagepool_add_main.js @@ -35,6 +35,9 @@ kimchi.initStorageAddPage = function() { }, { label : "NFS", value : "netfs" + } ,{ + label : "ISCSI", + value : "iscsi" } ]; kimchi.listHostPartitions(function(data) { if (data.length > 0) { @@ -57,16 +60,34 @@ kimchi.initStorageAddPage = function() { $('.path-section').removeClass('tmpl-html'); $('.logical-section').addClass('tmpl-html'); $('.nfs-section').addClass('tmpl-html'); + $('.iscsi-section').addClass('tmpl-html'); } else if ($(this).val() === 'netfs') { $('.path-section').addClass('tmpl-html'); $('.logical-section').addClass('tmpl-html'); $('.nfs-section').removeClass('tmpl-html'); + $('.iscsi-section').addClass('tmpl-html'); + } else if ($(this).val() === 'iscsi') { + $('.path-section').addClass('tmpl-html'); + $('.logical-section').addClass('tmpl-html'); + $('.nfs-section').addClass('tmpl-html'); + $('.iscsi-section').removeClass('tmpl-html'); } else { $('.path-section').addClass('tmpl-html'); $('.logical-section').removeClass('tmpl-html'); $('.nfs-section').addClass('tmpl-html'); + $('.iscsi-section').addClass('tmpl-html'); } }); + $('#authId').click(function() { + if ($(this).prop("checked")) { + $('.authenticationfield').removeClass('tmpl-html'); + } else { + $('.authenticationfield').addClass('tmpl-html'); + } + }); + $('#iscsiportId').keyup(function(event) { + $(this).toggleClass("invalid-field",!/^[0-9]+$/.test($(this).val())); + }); }); }; @@ -85,6 +106,8 @@ kimchi.validateForm = function() { return kimchi.validateDirForm(); } else if (poolType === "netfs") { return kimchi.validateNfsForm(); + } else if (poolType === "iscsi") { + return kimchi.validateIscsiForm(); } else { return kimchi.validateLogicalForm(); } @@ -107,26 +130,44 @@ kimchi.validateDirForm = function () { kimchi.validateNfsForm = function () { var nfspath = $('#nfspathId').val(); var nfsserver = $('#nfsserverId').val(); - if ('' === nfsserver) { - kimchi.message.error(i18n['msg.pool.edit.nfsserver.blank']); + if (!kimchi.validateServer(nfsserver)) { return false; } - if ('' === nfspath) { kimchi.message.error(i18n['msg.pool.edit.nfspath.blank']); return false; } - var domain = "([0-9a-z_!~*'()-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6}" - var ip = "(\\d{1,3}\.){3}\\d{1,3}" - regex = new RegExp('^' + domain + '|' + ip + '$') + if (!/((\/([0-9a-zA-Z-_\.]+)))$/.test(nfspath)) { + kimchi.message.error(i18n['msg.validate.pool.edit.nfspath']); + return false; + } + return true; +}; - if(!regex.test(nfsserver)) { - kimchi.message.error(i18n['msg.validate.pool.edit.nfsserver']); +kimchi.validateIscsiForm = function() { + var iscsiServer = $('#iscsiserverId').val(); + var iscsiTarget = $('#iscsiTargetId').val(); + if (!kimchi.validateServer(iscsiServer)) { return false; } + if ('' === iscsiTarget) { + kimchi.message.error(i18n['msg.pool.edit.iscsitarget.blank']); + return false; + } + return true; +}; - if (!/((\/([0-9a-zA-Z-_\.]+)))$/.test(nfspath)) { - kimchi.message.error(i18n['msg.validate.pool.edit.nfspath']); +kimchi.validateServer = function(serverField) { + if ('' === serverField) { + kimchi.message.error(i18n['msg.pool.edit.server.blank']); + return false; + } + var domain = "([0-9a-z_!~*'()-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6}" + var ip = "(\\d{1,3}\.){3}\\d{1,3}" + regex = new RegExp('^' + domain + '|' + ip + '$') + + if (!regex.test(serverField)) { + kimchi.message.error(i18n['msg.validate.pool.edit.server']); return false; } return true; @@ -144,6 +185,7 @@ kimchi.validateLogicalForm = function () { kimchi.addPool = function(event) { if (kimchi.validateForm()) { var formData = $('#form-pool-add').serializeObject(); + delete formData.authname; var poolType = $("#poolType").val(); if (poolType === 'dir') { formData.path = $('#pathId').val(); @@ -158,11 +200,24 @@ kimchi.addPool = function(event) { } delete formData.devices; formData.source = source; - } else { + } else if (poolType === 'netfs'){ var source = {}; source.path = $('#nfspathId').val(); source.host = $('#nfsserverId').val(); formData.source = source; + } else { + var source = {}; + source.target = $('#iscsiTargetId').val(); + source.host = $('#iscsiserverId').val(); + source.port = $('#iscsiportId').val(); + source.auth = []; + if ($('#authId').prop("checked")) { + source.auth.push({ + "username" : $('#usernameId').val(), + "password" : $('#passwordId').val() + }); + } + formData.source = source; } if (poolType === 'logical') { var settings = { diff --git a/ui/js/src/kimchi.utils.js b/ui/js/src/kimchi.utils.js index 8af6a11..a23bf51 100644 --- a/ui/js/src/kimchi.utils.js +++ b/ui/js/src/kimchi.utils.js @@ -163,3 +163,8 @@ kimchi.changetoProperUnit = function(numOrg, digits, base) { kimchi.formatMeasurement = format; })(); + +kimchi.isUnsignedNumeric = function(number) { + var reg = /^d+(.d+)?$/ + return reg.test(number); +} diff --git a/ui/pages/i18n.html.tmpl b/ui/pages/i18n.html.tmpl index c1fc3d1..4a02e4d 100644 --- a/ui/pages/i18n.html.tmpl +++ b/ui/pages/i18n.html.tmpl @@ -94,11 +94,9 @@ var i18n = { 'msg.storagepool.confirm.delete':"$_("This will permanently delete the Storage Pool. Would you like to continue?")", 'msg.pool.edit.name.blank':"$_("The storage pool name can not be blank.")", 'msg.pool.edit.path.blank':"$_("The storage pool path can not be blank.")", - 'msg.pool.edit.nfsserver.blank':"$_("NFS server can not be blank.")", 'msg.pool.edit.nfspath.blank':"$_("NFS server mount path can not be blank.")", 'msg.validate.pool.edit.name':"$_("Invalid Storage Pool name. It may only contain letters, numbers, underscores, and hyphens.")", 'msg.validate.pool.edit.path':"$_("This is not a real linux path.")", - 'msg.validate.pool.edit.nfsserver':"$_("This is not a valid NFS server.")", 'msg.validate.pool.edit.nfspath':"$_("Invalid nfs mount path.")", 'msg.kimchi.storage.pool.empty':"$_("This storage pool is empty.")", 'msg.kimchi.list.volume.fail':"$_("Failed to list the storage pool.")", @@ -121,7 +119,10 @@ var i18n = { 'action_create': "$_("Create")", 'msg_warning': "$_("Warning")", 'msg.logicalpool.confirm.delete': "$_("It will format your disk and you will loose any data in" - " there, are you sure to continue? ")" + " there, are you sure to continue? ")", + 'msg.pool.edit.iscsitarget.blank': "$_("The iscsi target can not be blank.")", + 'msg.pool.edit.server.blank':"$_("Server name can not be blank.")", + 'msg.validate.pool.edit.server':"$_("This is not a valid Server Name or IP. please, modify it.")" }; </script> </body> diff --git a/ui/pages/storagepool-add.html.tmpl b/ui/pages/storagepool-add.html.tmpl index 5a2dd45..d70f958 100644 --- a/ui/pages/storagepool-add.html.tmpl +++ b/ui/pages/storagepool-add.html.tmpl @@ -27,7 +27,7 @@ <!DOCTYPE html> <html> <body> - <div class="window" style="width: 600px; height: 600px;"> + <div class="window" style="width: 600px; height: 700px;"> <header> <h1 class="title">$_("Define a New Storage Pool")</h1> <div class="close">X</div> @@ -40,7 +40,7 @@ <p class="text-help"> $_("The name used to identify the storage pools, and it should not be empty.") </p> - <input id="poolId" type="text" class="text" style="width: 300px" + <input id="poolId" required="required" type="text" class="text" style="width: 300px" name="name"> </div> </section> @@ -65,7 +65,7 @@ $_("The path of the Storage Pool. Each Storage Pool must have a unique path.")</p> <p class="text-help"> $_("Kimchi will try to create the directory when it does not already exist in your system.")</p> - <input id="pathId" type="text" class="text" style="width: 300px"> + <input id="pathId" type="text" class="text" required="required" style="width: 300px"> </div> <div class="clear"></div> </section> @@ -76,7 +76,7 @@ <div class="field"> <p class="text-help"> $_("NFS server IP or hostname. It should not be empty.")</p> - <input id="nfsserverId" type="text" class="text" + <input id="nfsserverId" required="required" type="text" class="text" style="width: 300px"> </div> </section> @@ -84,10 +84,9 @@ <h2>4. $_("NFS Path")</h2> <div class="field"> <p class="text-help">$_("The nfs exported path on nfs server")</p> - <input id="nfspathId" type="text" class="text" + <input id="nfspathId" required="required" type="text" class="text" style="width: 300px"> - <input type="hidden" id="localpathId" class="text" - value="none"> + <input type="hidden" id="localpathId" class="text" value="none"> </div> <div class="clear"></div> </section> @@ -98,6 +97,37 @@ <div class="host-partition"></div> </section> </div> + <div class="iscsi-section tmpl-html"> + <section class="form-section"> + <h2>3. $_("ISCSI server")</h2> + <div class="field"> + <p class="text-help"> + $_("ISCSI server IP or hostname. It should not be empty.")</p> + <input id="iscsiserverId" placeholder="$_("Server")" type="text" class="text" style="width: 300px"> + <input id="iscsiportId" placeholder="$_("port")" type="text" class="text" style="width:40px" maxlength='4'> + </div> + </section> + <section class="form-section"> + <h2>4. $_("Target")</h2> + <div class="field"> + <p class="text-help">$_("The ISCSI target on ISCSI server")</p> + <input id="iscsiTargetId" type="text" class="text" style="width: 300px"> + </div> + </section> + <section class="form-section"> + <div class="field"> + <input type="checkbox" id="authId" name="authname"> + <label>$_("Add ISCSI Authentication...")</label> + </div> + </section> + <section class="authenticationfield form-section tmpl-html"> + <h2>5. $_("ISCSI Authentication")</h2> + <div class="field"> + <input id="usernameId" placeholder="$_("UserName")" type="text" class="text" style="width: 150px"> + <input id="passwordId" placeholder="$_("Password")" type="text" class="text" style="width: 150px"> + </div> + </section> + </div> </form> </div> <footer> @@ -113,8 +143,8 @@ </script> <script id="partitionTmpl" type="html/text"> <div> - <input type="checkbox" value="{path}" name="devices"> - <label>{path}</label> + <input type="checkbox" value="{path}" name="source.devices"> + <label>{path}</label> </div> </script> </body> -- 1.7.1