[PATCH v4 0/4] Fix: Report Overwritten when Provided Name Existing

When user provides an existing debug report name, then the server will generate a new debug report and overwrite the old one. Fixed it in this patch to detect the existing name and ask the user to choose another name. v3 -> v4: 4a) Switched to InvalidParameter instead of new ResourceAlreadyExists (Aline's comment) 4b) Fixed screen blink problem (Aline's comment) v2 -> v3: 3a) Reduced code redundant (Wen Wang's comment) v1 -> v2: 2a) Recovered Generate Button behavior (Wen Wang's comment) 2b) Leveraged get_list() function to check name existence (Aline's comment) Hongliang Wang (4): Add Name Existence Check for Debug Report when Create Add License Statement in kimchi.report_add_main.js Add progress Event Handler for Asynchronized Tasks Keep User from Generating a Report with an Existing Name src/kimchi/i18n.py | 1 + src/kimchi/model/debugreports.py | 5 +- ui/js/src/kimchi.api.js | 3 +- ui/js/src/kimchi.report_add_main.js | 105 +++++++++++++++++++++++------------- 4 files changed, 74 insertions(+), 40 deletions(-) -- 1.8.1.4

Prevent user to overwrite an existing debug report with same name. Signed-off-by: Hongliang Wang <hlwang@linux.vnet.ibm.com> --- src/kimchi/i18n.py | 1 + src/kimchi/model/debugreports.py | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py index 452ede2..90ecc17 100644 --- a/src/kimchi/i18n.py +++ b/src/kimchi/i18n.py @@ -207,6 +207,7 @@ messages = { "KCHDR0005E": _("Unable to generate debug report %(name)s. Details: %(err)s"), "KCHDR0006E": _("You should give a name for the debug file report."), "KCHDR0007E": _("Name should be a string. Only letters, digits and hyphen ('-') are allowed."), + "KCHDR0008E": _("The debug report with specified name \"%(name)s\" already exists. Please use another one."), "KCHSR0001E": _("Storage server %(server)s was not used by Kimchi"), diff --git a/src/kimchi/model/debugreports.py b/src/kimchi/model/debugreports.py index cd31b31..18c2187 100644 --- a/src/kimchi/model/debugreports.py +++ b/src/kimchi/model/debugreports.py @@ -26,7 +26,7 @@ import subprocess import time from kimchi import config -from kimchi.exception import KimchiException, NotFoundError, OperationFailed +from kimchi.exception import KimchiException, NotFoundError, OperationFailed, InvalidParameter from kimchi.model.tasks import TaskModel from kimchi.utils import add_task, kimchi_log from kimchi.utils import run_command @@ -42,6 +42,9 @@ class DebugReportsModel(object): # Generate a name with time and millisec precision, if necessary if ident is None or ident == "": ident = 'report-' + str(int(time.time() * 1000)) + else: + if ident in self.get_list(): + raise InvalidParameter("KCHDR0008E", {"name": ident}) taskid = self._gen_debugreport_file(ident) return self.task.lookup(taskid) -- 1.8.1.4

Added license statement. Signed-off-by: Hongliang Wang <hlwang@linux.vnet.ibm.com> --- ui/js/src/kimchi.report_add_main.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/ui/js/src/kimchi.report_add_main.js b/ui/js/src/kimchi.report_add_main.js index ad2bb39..28c3e66 100644 --- a/ui/js/src/kimchi.report_add_main.js +++ b/ui/js/src/kimchi.report_add_main.js @@ -1,3 +1,20 @@ +/* + * Project Kimchi + * + * Copyright IBM, Corp. 2014 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ kimchi.report_add_main = function() { var reportGridID = 'available-reports-grid'; var addReportForm = $('#form-report-add'); -- 1.8.1.4

Asynchronized tasks need continuously tracking until they are finished to allow API consumer register a listener to take actions accordingly. One of the common case is file uploading. When the user uploads a file he expects there is a progress bar showing upload percentage. In our case, after we submit the generate debug report form, we will close the generate window and add a "generating" line in the grid when we receive the first response with HTTP status code 200. If the status code is 4xx, we will not close the window because HTTP 4xx means there is something wrong with user's input and we will keep the window there to allow the user do some correction. Signed-off-by: Hongliang Wang <hlwang@linux.vnet.ibm.com> --- ui/js/src/kimchi.api.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js index 0d96d07..c28a080 100644 --- a/ui/js/src/kimchi.api.js +++ b/ui/js/src/kimchi.api.js @@ -655,7 +655,7 @@ var kimchi = { }); }, - createReport: function(settings, suc, err) { + createReport: function(settings, suc, err, progress) { var taskID = -1; var onTaskResponse = function(result) { var taskStatus = result['status']; @@ -664,6 +664,7 @@ var kimchi = { if(kimchi.stopTrackingReport === true) { return; } + progress && progress(result); setTimeout(function() { trackTask(); }, 200); -- 1.8.1.4

If user provides an existing report name, then tell the error and keep generate report window there to allow the user to enter a new name. Signed-off-by: Hongliang Wang <hlwang@linux.vnet.ibm.com> --- ui/js/src/kimchi.report_add_main.js | 88 +++++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/ui/js/src/kimchi.report_add_main.js b/ui/js/src/kimchi.report_add_main.js index 28c3e66..43484f5 100644 --- a/ui/js/src/kimchi.report_add_main.js +++ b/ui/js/src/kimchi.report_add_main.js @@ -17,9 +17,25 @@ */ kimchi.report_add_main = function() { var reportGridID = 'available-reports-grid'; + var generateButton = $('#' + reportGridID + '-generate-button'); var addReportForm = $('#form-report-add'); var submitButton = $('#button-report-add'); var nameTextbox = $('input[name="name"]', addReportForm); + nameTextbox.select(); + + /* + * FIXME: + * Currently, all buttons will be disabled when a report is being + * generated. Though operations on existing debug reports shouldn't + * be affected when a new one is being generated, and it's expected + * to enable Rename/Remove/Download Buttons whenever users click an + * existing report row in the grid. + */ + var disableToolbarButtons = function(event, toEnable) { + $('#' + reportGridID + ' .grid-toolbar button') + .prop('disabled', !toEnable); + }; + var submitForm = function(event) { if(submitButton.prop('disabled')) { return false; @@ -31,44 +47,16 @@ kimchi.report_add_main = function() { return false; } var formData = addReportForm.serializeObject(); - kimchi.window.close(); - $('#' + reportGridID + '-generate-button').prop('disabled',true); - $('#' + reportGridID + '-remove-button').prop('disabled',true); - $('#' + reportGridID + '-download-button').prop('disabled',true); - $('#' + reportGridID + '-rename-button').prop('disabled',true); - $('.grid-body table tr', '#' + reportGridID).click(function() { - $('#' + reportGridID + '-remove-button').prop('disabled',true); - $('#' + reportGridID + '-download-button').prop('disabled',true); - $('#' + reportGridID + '-rename-button').prop('disabled',true); - }); - var textboxValue = $('#report-name-textbox').val(); - if (textboxValue != "") { - $('.grid-body-view table', '#' + reportGridID).prepend( - '<tr>' + - '<td>' + - '<div class="cell-text-wrapper">' + textboxValue + '</div>' + - '</td>' + - '<td id ="id-debug-img">' + - '<div class="cell-text-wrapper">' + i18n['KCHDR6007M'] + '</div>' + - '</td>' + - '</tr>' - ); - } - else { - $('.grid-body-view table', '#' + reportGridID).prepend( - '<tr>' + - '<td>' + - '<div class="cell-text-wrapper">' + i18n['KCHDR6012M'] + '</div>' + - '</td>' + - '<td id ="id-debug-img">' + - '<div class="cell-text-wrapper">' + i18n['KCHDR6007M'] + '</div>' + - '</td>' + - '</tr>' - ); - } + var taskAccepted = false; + disableToolbarButtons(); + submitButton.prop('disabled', true); + $('.grid-body table tr', '#' + reportGridID) + .on('click', disableToolbarButtons); kimchi.createReport(formData, function(result) { $('.grid-body-view table tr:first-child', '#' + reportGridID).remove(); - $('#' + reportGridID + '-generate-button').prop('disabled',false); + $('.grid-body table tr', '#' + reportGridID) + .off('click', disableToolbarButtons); + generateButton.prop('disabled', false); kimchi.topic('kimchi/debugReportAdded').publish({ result: result }); @@ -81,8 +69,32 @@ kimchi.report_add_main = function() { else { var errText = result['responseJSON']['reason']; } - result && kimchi.message.error(errText) - $('.grid-body-view table tr:first-child', '#' + reportGridID).remove(); + result && kimchi.message.error(errText); + taskAccepted && + $('.grid-body-view table tr:first-child', + '#' + reportGridID).remove(); + $('.grid-body table tr', '#' + reportGridID) + .off('click', disableToolbarButtons); + generateButton.prop('disabled', false); + submitButton.prop('disabled', false); + nameTextbox.select(); + }, function(result) { + if(taskAccepted) { + return; + } + taskAccepted = true; + kimchi.window.close(); + var reportName = nameTextbox.val() || i18n['KCHDR6012M']; + $('.grid-body-view table tbody', '#' + reportGridID).prepend( + '<tr>' + + '<td>' + + '<div class="cell-text-wrapper">' + reportName + '</div>' + + '</td>' + + '<td id ="id-debug-img">' + + '<div class="cell-text-wrapper">' + i18n['KCHDR6007M'] + '</div>' + + '</td>' + + '</tr>' + ); }); event.preventDefault(); -- 1.8.1.4
participants (2)
-
Aline Manera
-
Hongliang Wang