[Kimchi-devel] [PATCH] [Kimchi] Create logical pool from existing VG

Aline Manera alinefm at linux.vnet.ibm.com
Mon Feb 22 20:33:23 UTC 2016


Hi Peter,

The API to create a new logical pool from existing VG is:

POST /plugins/kimchi/storagepools {type: logical, name: <vg-name>, 
source: {from_vg: true}}

With this patch the 'from_vg' parameter is not aligned with 'source' 
which is raising an error (see below):




Also when no VG is found in the system the message should be updated.
Instead of "No available partitions found." use "No LVM found in the 
system."




On 02/15/2016 08:35 AM, peterpnns at gmail.com wrote:
> From: peterpennings <peterpnns at gmail.com>
>
> Signed-off-by: peterpennings <peterpnns at gmail.com>
> ---
>   ui/js/src/kimchi.api.js                  |  13 ++++
>   ui/js/src/kimchi.storagepool_add_main.js | 103 +++++++++++++++++++++++++++----
>   ui/pages/storagepool-add.html.tmpl       |  39 ++++++++----
>   3 files changed, 132 insertions(+), 23 deletions(-)
>
> diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js
> index 3519196..b780875 100644
> --- a/ui/js/src/kimchi.api.js
> +++ b/ui/js/src/kimchi.api.js
> @@ -711,6 +711,19 @@ var kimchi = {
>           });
>       },
>
> +    getHostVgs: function(suc, err) {
> +        var url = 'plugins/kimchi/host/vgs/';
> +        wok.requestJSON({
> +            url : url,
> +            type : 'GET',
> +            contentType : 'application/json',
> +            timeout: 2000,
> +            dataType : 'json',
> +            success : suc,
> +            error : err
> +        });
> +    },
> +
>       addVMStorage : function(settings, suc, err) {
>           var vm = encodeURIComponent(settings['vm']);
>           delete settings['vm'];
> diff --git a/ui/js/src/kimchi.storagepool_add_main.js b/ui/js/src/kimchi.storagepool_add_main.js
> index 0e9654a..a1b2aeb 100644
> --- a/ui/js/src/kimchi.storagepool_add_main.js
> +++ b/ui/js/src/kimchi.storagepool_add_main.js
> @@ -18,6 +18,7 @@
>
>   kimchi.storagepool_add_main = function() {
>       kimchi.initStorageAddPage();
> +    sessionStorage.clear();
>       $('#form-pool-add').on('submit', kimchi.addPool);
>       $('#pool-doAdd').on('click', kimchi.addPool);
>       // 'pool-doAdd' button starts as disabled.
> @@ -126,13 +127,15 @@ kimchi.initStorageAddPage = function() {
>       kimchi.listHostPartitions(function(data) {
>           if (data.length > 0) {
>               var deviceHtml = $('#partitionTmpl').html();
> -            var listHtml = '';
> +            var listHtml = '<table class="table table-hover"><thead><tr><th></th><th>device</th><th>path</th><th>size (GiB)</th></tr></thead><tbody>';
>               valid_types = ['part', 'disk', 'mpath'];
>               $.each(data, function(index, value) {
>                   if (valid_types.indexOf(value.type) !== -1) {
> +                    value.size = (value.size / 1000000000).toFixed(2);
>                       listHtml += wok.substitute(deviceHtml, value);
>                   }
>               });
> +            listHtml += '</tbody></table>';
>               $('.host-partition', '#form-pool-add').html(listHtml);
>           } else {
>               $('.host-partition').html(i18n['KCHPOOL6011M']);
> @@ -143,6 +146,26 @@ kimchi.initStorageAddPage = function() {
>           $('.host-partition').addClass('text-help');
>       });
>
> +    kimchi.getHostVgs(function(data){
> +        if (data.length > 0) {
> +            var deviceHtml = $('#existingLvmTmpl').html();
> +            var listHtml = '<table class="table table-hover"><thead><tr><th></th><th>device</th><th>size (GiB)</th><th>free size (GiB)</th></tr></thead><tbody>';
> +            $.each(data, function(index, value) {
> +                value.size = (value.size / 1000000000).toFixed(2);
> +                value.free = (value.free / 1000000000).toFixed(2);
> +                listHtml += wok.substitute(deviceHtml, value);
> +            });
> +            listHtml += '</tbody></table>';
> +            $('.lvm-partition').html(listHtml);
> +        } else {
> +            $('.lvm-partition').html(i18n['KCHPOOL6011M']);
> +            $('.lvm-partition').addClass('text-help');
> +        }
> +    }, function(err) {
> +        $('.lvm-partition').html(i18n['KCHPOOL6013M'] + '<br/>(' + err.responseJSON.reason + ')');
> +        $('.lvm-partition').addClass('text-help');
> +    });
> +
>       kimchi.getHostFCDevices(function(data){
>           $scsiSelect = $('#scsiAdapter');
>           if(data.length>0){
> @@ -238,6 +261,14 @@ kimchi.initStorageAddPage = function() {
>       });
>
>       $('#poolTypeInputId').change(function() {
> +
> +        kimchi.cleanLogicalForm();
> +        $('#poolId').css("background-color", "#ffffff").attr('readonly', false);
> +        $('[name="logicalRadioSelection"]')[1].checked = true;
> +        $('.lvm-group').addClass('hidden');
> +        $('.disk-group').removeClass('hidden');
> +        kimchi.setOldStorageName();
> +
>           var poolObject = {'dir': ".path-section", 'netfs': '.nfs-section',
>                             'iscsi': '.iscsi-section', 'scsi': '.scsi-section',
>                             'logical': '.logical-section'};
> @@ -265,9 +296,50 @@ kimchi.initStorageAddPage = function() {
>       }).change(function(event) {
>           $(this).toggleClass("invalid-field",!wok.isServer($(this).val().trim()));
>       });
> +
> +    $('[name="logicalRadioSelection"]').change(function(){
> +        kimchi.cleanLogicalForm();
> +        kimchi.setOldStorageName();
> +        var selectedRadio = ($(this).val());
> +        var logicalObject = {'existingLvm' : '.lvm-group', 'rawDisk' : '.disk-group'};
> +
> +        if(selectedRadio === 'existingLvm') {
> +            $('[name="lvmTmplRadioSelection"]').change(function(){
> +                $('#poolId').css("background-color", "#EEE").val($(this).val()).attr('readonly', true);
> +            });
> +        } else {
> +            $('#poolId').css("background-color", "#ffffff").attr('readonly', false);
> +        }
> +
> +        $.each(logicalObject, function(type, value) {
> +            if(selectedRadio === type){
> +                $(value).removeClass('hidden');
> +            } else {
> +                $(value).addClass('hidden');
> +            }
> +        });
> +    });
> +
> +    $('#poolId').blur(function() {
> +        sessionStorage.setItem('oldStorageName', $('#poolId').val());
> +    })
> +
>       kimchi.setupISCSI();
>   };
>
> +kimchi.setOldStorageName = function() {
> +    if(sessionStorage.getItem('oldStorageName') !== ''){
> +        $('#poolId').val(sessionStorage.getItem('oldStorageName'));
> +    } else {
> +        $('#poolId').val('');
> +    }
> +}
> +
> +kimchi.cleanLogicalForm = function() {
> +    $("input[name=devices]").attr('checked', false);
> +    $("input[name=lvmTmplRadioSelection]").attr('checked', false);
> +}
> +
>   /* Returns 'true' if all form fields were filled, 'false' if
>    * any field is left blank. The function takes into account
>    * the current poolType selected.
> @@ -288,7 +360,7 @@ kimchi.inputsNotBlank = function() {
>           if (!$('#iscsiserverId').val()) { return false; }
>           if (!$('#iscsiTargetId').val()) { return false; }
>       } else if (poolType === "logical") {
> -        if ($("input[name=devices]:checked").length === 0){
> +        if ($("input[name=devices]:checked").length === 0 && $("input[name=lvmTmplRadioSelection]:checked").length === 0){
>                       return false;
>               }
>       }
> @@ -351,7 +423,7 @@ kimchi.validateServer = function(serverField) {
>   };
>
>   kimchi.validateLogicalForm = function () {
> -    if ($("input[name=devices]:checked").length === 0) {
> +    if ($("input[name=devices]:checked").length === 0 && $("input[name=lvmTmplRadioSelection]:checked").length === 0) {
>           wok.message.error.code('KCHPOOL6006E');
>           return false;
>       } else {
> @@ -363,21 +435,28 @@ kimchi.addPool = function(event) {
>       if (kimchi.validateForm()) {
>           var formData = $('#form-pool-add').serializeObject();
>           delete formData.authname;
> +        delete formData.logicalRadioSelection;
> +        delete formData.lvmTmplRadioSelection;
>           var poolType = $('#poolTypeInputId').val();
>           formData.type = poolType;
>           if (poolType === 'dir') {
>               formData.path = $('#pathId').val();
>           } else if (poolType === 'logical') {
> -            var source = {};
> -            if (!$.isArray(formData.devices)) {
> -                var deviceObj = [];
> -                deviceObj[0] =  formData.devices;
> -                source.devices = deviceObj;
> -            } else {
> -                source.devices = formData.devices;
> +            var logicalrRadioSelected = $("input[name='logicalRadioSelection']:checked").val();
> +            if (logicalrRadioSelected === 'rawDisk') {
> +                var source = {};
> +                if (!$.isArray(formData.devices)) {
> +                    var deviceObj = [];
> +                    deviceObj[0] =  formData.devices;
> +                    source.devices = deviceObj;
> +                } else {
> +                    source.devices = formData.devices;
> +                }
> +                delete formData.devices;
> +                formData.source = source;
> +            } else if (logicalrRadioSelected === 'existingLvm') {
> +                formData.from_vg = true;
>               }
> -            delete formData.devices;
> -            formData.source = source;
>           } else if (poolType === 'netfs'){
>               var source = {};
>               source.path = $('#nfspathId').val();
> diff --git a/ui/pages/storagepool-add.html.tmpl b/ui/pages/storagepool-add.html.tmpl
> index f7f9b29..b3084fd 100644
> --- a/ui/pages/storagepool-add.html.tmpl
> +++ b/ui/pages/storagepool-add.html.tmpl
> @@ -82,8 +82,18 @@
>                           </div>
>                   </div>
>                   <div class="logical-section hidden row">
> -                    <div class="form-group storageType">
> -                        <label>$_("Device path")</label>
> +                    <div>
> +                        <input type="radio" class="wok-radio" id="existingLvm" name="logicalRadioSelection" value="existingLvm" />
> +                        <label for="existingLvm">$_("Create from existing LVM")</label>
> +                        <input type="radio" class="wok-radio" id="rawDisk" name="logicalRadioSelection" value="rawDisk" checked />
> +                        <label for="rawDisk">$_("Create from raw disk")</label>
> +                    </div>
> +                    <div class="lvm-group hidden">
> +                        <div class="lvm-partition">
> +                            <span class="wok-loading-icon"></span><span>$_("Looking for existing lvms ...")</span>
> +                        </div>
> +                    </div>
> +                    <div class="form-group disk-group storageType">
>                           <div class="host-partition">
>                               <span class="wok-loading-icon"></span><span>$_("Looking for available partitions ...")</span>
>                           </div>
> @@ -156,16 +166,23 @@
>       <script>
>           kimchi.storagepool_add_main();
>       </script>
> +
>       <script id="partitionTmpl" type="html/text">
> -    <div>
> -        <input type="checkbox" class="wok-checkbox" id="{name}" value="{path}" name="devices">
> -        <label for="{name}">
> -            <div>
> -                <span class="device-name">{name}</span>
> -                <span class="device-path">{path}</span>
> -            </div>
> -        </label>
> -    </div>
> +    <tr>
> +        <td><input type="checkbox" class="wok-checkbox" id="{name}" value="{path}" name="devices"><label for="{name}"></label></td>
> +        <td>{name}</td>
> +        <td>{path}</td>
> +        <td>{size}</td>
> +    </tr>
> +    </script>
> +
> +    <script id="existingLvmTmpl" type="html/text">
> +    <tr>
> +        <td><input type="radio" class="wok-radio" id="{name}" name="lvmTmplRadioSelection" value="{name}" /><label for="{name}"></label></td>
> +        <td>{name}</td>
> +        <td>{size}</td>
> +        <td>{free}</td>
> +    </tr>
>       </script>
>   </body>
>   </html>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ovirt.org/pipermail/kimchi-devel/attachments/20160222/920ca521/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: dcdacfbh.
Type: image/jpeg
Size: 17550 bytes
Desc: not available
URL: <http://lists.ovirt.org/pipermail/kimchi-devel/attachments/20160222/920ca521/attachment.jpe>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: bceebege.
Type: image/jpeg
Size: 48800 bytes
Desc: not available
URL: <http://lists.ovirt.org/pipermail/kimchi-devel/attachments/20160222/920ca521/attachment-0001.jpe>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: jefhjjei.
Type: image/jpeg
Size: 7040 bytes
Desc: not available
URL: <http://lists.ovirt.org/pipermail/kimchi-devel/attachments/20160222/920ca521/attachment-0002.jpe>


More information about the Kimchi-devel mailing list