[Kimchi-devel] [PATCH V2 1/2] Add UI support of iscsi
Zhou Zheng Sheng
zhshzhou at linux.vnet.ibm.com
Fri Dec 27 10:15:45 UTC 2013
on 2013/12/26 20:34, Rodrigo Trujillo wrote:
> On 12/26/2013 12:33 AM, Zhou Zheng Sheng wrote:
>> 于 2013年12月25日 01:51, Rodrigo Trujillo 写道:
>>> On 12/23/2013 12:57 AM, zhoumeina wrote:
>>>> 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 at linux.vnet.ibm.com>
>>>> ---
>>>> ui/js/src/kimchi.storagepool_add_main.js | 54
>>>> ++++++++++++++++++++++++-----
>>>> ui/pages/i18n.html.tmpl | 7 ++--
>>>> ui/pages/storagepool-add.html.tmpl | 22 +++++++++++-
>>>> 3 files changed, 68 insertions(+), 15 deletions(-)
>>>>
>>>> diff --git a/ui/js/src/kimchi.storagepool_add_main.js
>>>> b/ui/js/src/kimchi.storagepool_add_main.js
>>>> index b31610a..cd8f1ae 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,14 +60,22 @@ 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');
>>>> }
>>>> });
>>>> });
>>>> @@ -85,6 +96,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 +120,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;
>>>> @@ -153,6 +184,9 @@ kimchi.addPool = function(event) {
>>>> deviceObj[0] = formData.devices;
>>>> formData.devices = deviceObj;
>>>> }
>>>> + } else if (poolType === 'iscsi'){
>>>> + formData.srcTarget = $('#iscsiserverId').val();
>>>> + formData.srcHost = $('#iscsiTargetId').val();
>>>> } else {
>>>> formData.nfspath = $('#nfspathId').val();
>>>> formData.nfsserver = $('#nfsserverId').val();
>>>> 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 3ab9ae5..2898540 100644
>>>> --- a/ui/pages/storagepool-add.html.tmpl
>>>> +++ b/ui/pages/storagepool-add.html.tmpl
>>>> @@ -84,8 +84,7 @@
>>>> <p class="text-help">$_("The nfs
>>>> exported path on nfs server")</p>
>>>> <input id="nfspathId" 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>
>>>> @@ -104,6 +103,25 @@
>>>> <span class="text">$_("Create")</span>
>>>> </button>
>>>> </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" type="text"
>>>> class="text"
>>>> + style="width: 300px">
>>>> + </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>
>>>> + <div class="clear"></div>
>>>> + </section>
>>>> + </div>
>>> What about iSCSI servers that need authentication ?
>>> Will user provide the password through UI or some config file ?
>>>
>> kimchi transfers password in clear text, and it doesn't force https. I
>> think it's not safe, so I didn't add a password in the back-end. I think
>> there should be an overall solution for passwords (login, iSCSI CHAP,
>> and other). For now, the back-end implementation does not support iSCSI
>> authentication.
>>
>> This question has been asked twice, maybe I can add password support in
>> the new patch set, and just transfer the password in clear text.
>
> Sorry for have asked this again and thanks for the answer :)
> Agree, transfer password in plan text is not good. I am not UI/WEB
> specialist,
> but maybe there is a way to send the password already encrypted or force an
> https connection when sending passwords ... well, I need to read more about
> this.
>
>
>
Thanks! Maybe my word is a bit misleading. By writing "This question has
been asked twice", I actually mean "It's a sign that people want kimchi
to support iSCSI CHAP authentication". I actually took your advice and
wrote a new patch series, and added iSCSI authentication. I decided to
transfer the password in clear text, and rely on HTTPs for security.
Maybe someone will submit a patch to use only HTTPs by default. I'm
sending my new patches, maybe you could have a look at the back-end
implementation.
>>>> </footer>
>>>> </div>
>>>> <script>
>>> _______________________________________________
>>> Kimchi-devel mailing list
>>> Kimchi-devel at ovirt.org
>>> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>>>
>>
>
--
Thanks and best regards!
Zhou Zheng Sheng / 周征晟
E-mail: zhshzhou at linux.vnet.ibm.com
Telephone: 86-10-82454397
More information about the Kimchi-devel
mailing list