[Kimchi-devel] [PATCH] [Kimchi] Bug fix #521: Extend logical pool

Paulo Ricardo Paz Vital pvital at linux.vnet.ibm.com
Tue Sep 27 17:45:21 UTC 2016


Tested-By: Paulo Vital <pvital at linux.vnet.ibm.com>
Reviewed-By: Paulo Vital <pvital at linux.vnet.ibm.com>

On Tue, 2016-09-27 at 00:18 -0300, Aline Manera wrote:
> This patch proper shows the extend logical pool dialog to collect
> user
> information and do the request.
> 
> Signed-off-by: Aline Manera <alinefm at linux.vnet.ibm.com>
> ---
>  ui/css/kimchi.css                        |  3 +-
>  ui/css/src/modules/_guests.scss          |  3 +-
>  ui/js/src/kimchi.storage_main.js         | 81 ++++++++++++++++++++
> ------------
>  ui/js/src/kimchi.storagepool_add_main.js |  2 +-
>  ui/pages/i18n.json.tmpl                  |  9 ++--
>  ui/pages/tabs/storage.html.tmpl          | 45 +++++++++---------
>  6 files changed, 83 insertions(+), 60 deletions(-)
> 
> diff --git a/ui/css/kimchi.css b/ui/css/kimchi.css
> index 959508f..9a9ff25 100644
> --- a/ui/css/kimchi.css
> +++ b/ui/css/kimchi.css
> @@ -294,7 +294,8 @@
>    font-size: 32px;
>  }
> 
> -#wok-confirm-modal .modal-body strong {
> +#wok-confirm-modal .modal-body strong,
> +.modal-dialog .modal-body strong {
>    border-bottom: 1px dotted;
>  }
> 
> diff --git a/ui/css/src/modules/_guests.scss
> b/ui/css/src/modules/_guests.scss
> index 237b395..4947123 100644
> --- a/ui/css/src/modules/_guests.scss
> +++ b/ui/css/src/modules/_guests.scss
> @@ -46,7 +46,8 @@
>      }
>  }
> 
> -#wok-confirm-modal .modal-body strong {
> +#wok-confirm-modal .modal-body strong,
> +.modal-dialog .modal-body strong {
>      border-bottom: 1px dotted;
>  }
> 
> diff --git a/ui/js/src/kimchi.storage_main.js
> b/ui/js/src/kimchi.storage_main.js
> index 0d7a6d7..741fd59 100644
> --- a/ui/js/src/kimchi.storage_main.js
> +++ b/ui/js/src/kimchi.storage_main.js
> @@ -410,10 +410,8 @@ kimchi.storageBindClick = function() {
> 
>          $('.pool-extend').on('click', function(event) {
>              event.preventDefault();
> -            //$("#logicalPoolExtend").dialog("option", "poolName",
> $(this).data('name'));
> -            //$("#logicalPoolExtend").dialog("open");
> -            partitions = $(this).data('name');
> -            //$("#logicalPoolExtend").dialog("option", "poolName",
> $(this).data('name'));
> +            var poolName = $(this).data('name');
> +            kimchi.selectedSP = poolName;
>          });
>      }
> 
> @@ -478,17 +476,23 @@ kimchi._generateVolumeHTML = function(volume) {
>      return volumeHtml[0].outerHTML;
>  };
> 
> +
> +kimchi.getPoolUsageIcon = function(usage) {
> +    if (usage <= 100 && usage >= 85)
> +        return 'icon-high';
> +
> +    if (usage <= 85 && usage >= 75)
> +        return 'icon-med';
> +
> +    return 'icon-low';
> +};
> +
> +
>  kimchi.doUpdateStoragePool = function(poolObj){
>      var poolName = poolObj.data('name');
>      kimchi.getStoragePool(poolName, function(result) {
>          result.usage = Math.round(result.allocated / result.capacity
> * 100) || 0;
> -        if (result.usage <= 100 && result.usage >= 85) {
> -            result.icon = 'icon-high';
> -        }else if (result.usage <= 85 && result.usage >= 75 ) {
> -            result.icon = 'icon-med';
> -        } else {
> -            result.icon = 'icon-low';
> -        }
> +        result.icon = kimchi.getPoolUsageIcon(result.usage);
>          result.allocated =
> wok.changetoProperUnit(result.allocated,1);
>          $('> .column-usage > .usage-icon',poolObj).attr('class',
> 'usage-icon').addClass(result.icon).text(result.usage);
>          $('> .column-
> allocated',poolObj).attr('val',result.allocated).text(result.allocate
> d);
> @@ -649,30 +653,45 @@ kimchi.doListVolumes = function(poolObj) {
>      }, false);
>  };
> 
> -    kimchi.initLogicalPoolExtend = function() {
> -
> +kimchi.initLogicalPoolExtend = function() {
>      $('#logicalPoolExtend').on('hidden.bs.modal', function () {
>          $('.host-partition', '#logicalPoolExtend').empty();
>      });
> 
>      $('#logicalPoolExtend').on('show.bs.modal', function() {
> -        //$('#logicalPoolExtend2').find('.modal-content').html();
> -        kimchi.listHostPartitions(function(partitions) {
> -            $('#loading-info',
> '#logicalPoolExtend').removeClass('hidden');
> -            if (partitions.length > 0) {
> -                for (var i = 0; i < partitions.length; i++) {
> -                    if (partitions[i].type === 'part' ||
> partitions[i].type === 'disk') {
> -                        $('.host-partition',
> '#logicalPoolExtend').append(wok.substitute($('#logicalPoolExtendTmpl
> ').html(), partitions[i]));
> -                        $('#savePartitions',
> '#logicalPoolExtend').prop('disabled', false);
> +        // Make any change in the form fields enables the
> +        // 'savePartitions' button if all the visible form
> +        // fields are filled, disables it otherwise.
> +        $('#logicalPoolExtend').on('input change propertychange',
> function() {
> +            if ($("input[name=devices]:checked").length === 0) {
> +                $("#savePartitions").attr("disabled", true);
> +            }
> +            else {
> +                $("#savePartitions").attr("disabled", false);
> +            }
> +        });
> +
> +        kimchi.listHostPartitions(function(data) {
> +            if (data.length > 0) {
> +                var deviceHtml = $('#partitionTmpl').html();
> +                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>';
> +                var infoHtml = '<h3>' +
> i18n['KCHPOOL6019M'].replace('%1', '<strong>' + kimchi.selectedSP +
> '</strong>') + '</h3>';
> +                $('.host-partition',
> '#logicalPoolExtend').html(infoHtml + listHtml);
>              } else {
> -                $('#loading-info',
> '#logicalPoolExtend').addClass('hidden');
>                  $('.host-partition').html(i18n['KCHPOOL6011M']);
> +                $('.host-partition').addClass('text-help');
>              }
>          }, function(err) {
> -            $('#loading-info',
> '#logicalPoolExtend').addClass('hidden');
>              $('.host-partition').html(i18n['KCHPOOL6013M'] +
> '<br/>(' + err.responseJSON.reason + ')');
> +            $('.host-partition').addClass('text-help');
>          });
> 
>          $('#savePartitions', '#logicalPoolExtend').on('click',
> function(event) {
> @@ -681,14 +700,16 @@ kimchi.doListVolumes = function(poolObj) {
>              $("input[type='checkbox']:checked",
> "#logicalPoolExtend").each(function() {
>                  devicePaths.push($(this).prop('value'));
>              });
> -            kimchi.updateStoragePool($("#logicalPoolExtend"), {
> +            kimchi.updateStoragePool(kimchi.selectedSP, {
>                  disks: devicePaths
> -            }, function(partitions) {
> -                var item = $("#" +
> $("#logicalPoolExtend").dialog("option", "poolName"));
> +            }, function(pool) {
>                  $('#logicalPoolExtend').modal('hide');
> -                $(".usage", $(".storage-name",
> item)).text((Math.round(partitions.allocated / partitions.capacity *
> 100) || 0) + "%");
> -                $(".storage-text", $(".storage-capacity",
> item)).text(wok.changetoProperUnit(partitions.capacity, 1));
> -                $(".storage-text", $(".storage-allocate",
> item)).text(wok.changetoProperUnit(partitions.allocated, 1));
> +                var item = '#' + pool.name;
> +                var usage = Math.round(pool.allocated /
> pool.capacity * 100) || 0;
> +                var usageIcon = kimchi.getPoolUsageIcon(usage);
> +                $(".usage-icon", $(".column-usage",
> item)).attr('class', 'usage-icon').addClass(usageIcon).text(usage);
> +                $(".column-capacity",
> item).text(wok.changetoProperUnit(pool.capacity, 1));
> +                $(".column-allocated",
> item).text(wok.changetoProperUnit(pool.allocated, 1));
>              }, function(err) {
>                  $('#savePartitions',
> '#logicalPoolExtend').prop('disabled', true);
>                  $('#logicalPoolExtend').modal('hide');
> diff --git a/ui/js/src/kimchi.storagepool_add_main.js
> b/ui/js/src/kimchi.storagepool_add_main.js
> index 3fe2548..5a020ee 100644
> --- a/ui/js/src/kimchi.storagepool_add_main.js
> +++ b/ui/js/src/kimchi.storagepool_add_main.js
> @@ -127,7 +127,7 @@ kimchi.initStorageAddPage = function() {
>      kimchi.listHostPartitions(function(data) {
>          if (data.length > 0) {
>              var deviceHtml = $('#partitionTmpl').html();
> -            var listHtml = '<table class="table table-
> hover"><thead><tr><th></th><th>device</th><th>path</th><th>size
> (GiB)</th></tr></thead><tbody>';
> +            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) {
> diff --git a/ui/pages/i18n.json.tmpl b/ui/pages/i18n.json.tmpl
> index 7beee19..c67e9e8 100644
> --- a/ui/pages/i18n.json.tmpl
> +++ b/ui/pages/i18n.json.tmpl
> @@ -103,10 +103,6 @@
>      "KCHPOOL6008M": "$_("Failed to load iSCSI targets.")",
>      "KCHPOOL6009M": "$_("Would you like to continue?")",
>      "KCHPOOL6010M": "$_("This will permanently delete the following
> storage volumes: %1")",
> -
> -    "KCHPOOL6005E": "$_("Invalid NFS mount path.")",
> -    "KCHPOOL6006E": "$_("No logical device selected.")",
> -    "KCHPOOL6009E": "$_("This is not a valid Server Name or IP.
> Please, modify it.")",
>      "KCHPOOL6011M": "$_("No available partitions found.")",
>      "KCHPOOL6012M": "$_("The %1 storage pool is not persistent.
> Instead of deactivate, this action will permanently delete it. Would
> you like to continue?")",
>      "KCHPOOL6013M": "$_("Unable to retrieve partitions
> information.")",
> @@ -115,6 +111,11 @@
>      "KCHPOOL6016M": "$_("No LVM found in the system.")",
>      "KCHPOOL6017M": "$_("This will permanently wipe the following
> storage volumes: %1")",
>      "KCHPOOL6018M": "$_("Wipe Confirmation")",
> +    "KCHPOOL6019M": "$_("Select one or more partitions to be added
> to the logical pool %1:")",
> +
> +    "KCHPOOL6005E": "$_("Invalid NFS mount path.")",
> +    "KCHPOOL6006E": "$_("No logical device selected.")",
> +    "KCHPOOL6009E": "$_("This is not a valid Server Name or IP.
> Please, modify it.")",
> 
>      "KCHVMSTOR0001E": "$_("CDROM path needs to be a valid
> local/remote path and cannot be blank.")",
>      "KCHVMSTOR0002E": "$_("Disk pool or volume cannot be blank.")",
> diff --git a/ui/pages/tabs/storage.html.tmpl
> b/ui/pages/tabs/storage.html.tmpl
> index 92d9b75..4215d55 100644
> --- a/ui/pages/tabs/storage.html.tmpl
> +++ b/ui/pages/tabs/storage.html.tmpl
> @@ -74,21 +74,21 @@
>              <div id="logicalPoolExtend" class="modal fade
> logicalpool-modal" tabindex="-2" role="dialog" aria-
> labelledby="logicalPoolExtendLabel" aria-hidden="true">
>                  <div class="modal-dialog modal-sm">
>                      <div class="modal-content">
> -                      <div class="modal-header">
> +                        <div class="modal-header">
>                              <button type="button" class="close"
> data-dismiss="modal" aria-label="Close"><span aria-
> hidden="true">&times;</span></button>
> -                            <h4 class="modal-title"
> id="logicalPoolExtendLabel">$_("Device path")</h4>
> -                          </div>
> -                          <div class="modal-body">
> -                                <p  id="loading-info"
> class="hidden"><span class="wok-loading-
> icon"></span><span>$_("Looking for available partitions
> ...")</span></p>
> -                                <div class="host-partition">
> -                                </div>
> -                          </div>
> -                          <div class="modal-footer">
> -                              <button type="button"
> id="savePartitions" class="btn btn-default"
> disabled="disabled">$_("Save")</button>
> -                              <button type="button" class="btn btn-
> default" data-dismiss="modal">$_("Cancel")</button>
> -                          </div>
> +                            <h4 class="modal-title"
> id="logicalPoolExtendLabel">$_("Extending logical pool")</h4>
> +                        </div>
> +                        <div class="modal-body">
> +                            <div class="host-partition">
> +                                <span class="wok-loading-
> icon"></span><span>$_("Looking for available partitions ...")</span>
> +                            </div>
> +                        </div>
> +                        <div class="modal-footer">
> +                            <button type="button"
> id="savePartitions" class="btn btn-default"
> disabled="disabled">$_("Save")</button>
> +                            <button type="button" class="btn btn-
> default" data-dismiss="modal">$_("Cancel")</button>
> +                        </div>
>                      </div>
> -                  </div>
> +                </div>
>              </div>
>          </div>
>          <div class="wok-mask">
> @@ -200,17 +200,16 @@
>      </div>
>  </li>
>  </script>
> -<script id="logicalPoolExtendTmpl" 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>
> +
> +<script id="partitionTmpl" type="html/text">
> +    <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>
>      kimchi.storage_main();
>  </script>




More information about the Kimchi-devel mailing list