volume upload: fixed the UI after the change to move params to header.

Signed-off-by: Rajani Karuturi <rajanikaruturi@gmail.com>
This commit is contained in:
ramamurtis 2015-02-20 16:19:54 +05:30 committed by Rajani Karuturi
parent dc870b5114
commit da1d8f9dce
5 changed files with 134 additions and 109 deletions

View File

@ -1159,9 +1159,11 @@ setup_secstorage() {
log_it "setting up apache2 for post upload of volume/template"
a2enmod proxy
a2enmod proxy_http
a2enmod headers
SSL_FILE="/etc/apache2/sites-available/default-ssl"
PATTERN="RewriteRule ^\/upload\/(.*)"
CORS_PATTERN="Header set Access-Control-Allow-Origin"
if [ -f $SSL_FILE ]; then
if grep -q "$PATTERN" $SSL_FILE ; then
log_it "rewrite rules already exist in file $SSL_FILE"
@ -1172,6 +1174,14 @@ setup_secstorage() {
sed -i -e "s/<\/VirtualHost>/RewriteCond %{REQUEST_METHOD} =POST \n&/" $SSL_FILE
sed -i -e "s/<\/VirtualHost>/RewriteRule ^\/upload\/(.*) http:\/\/127.0.0.1:8210\/upload?uuid=\$1 [P,L] \n&/" $SSL_FILE
fi
if grep -q "$CORS_PATTERN" $SSL_FILE ; then
log_it "cors rules already exist in file $SSL_FILE"
else
log_it "adding cors rules to file: $SSL_FILE"
sed -i -e "s/<\/VirtualHost>/Header always set Access-Control-Allow-Origin \"*\" \n&/" $SSL_FILE
sed -i -e "s/<\/VirtualHost>/Header always set Access-Control-Allow-Methods \"POST, OPTIONS\" \n&/" $SSL_FILE
sed -i -e "s/<\/VirtualHost>/Header always set Access-Control-Allow-Headers \"x-requested-with, Content-Type, origin, authorization, accept, client-security-token, x-signature, x-metadata, x-expires\" \n&/" $SSL_FILE
fi
fi
service apache2 restart

View File

@ -61,6 +61,7 @@ config_apache2_conf() {
SSL_FILE="/etc/apache2/sites-available/default-ssl"
PATTERN="RewriteRule ^\/upload\/(.*)"
CORS_PATTERN="Header set Access-Control-Allow-Origin"
if [ -f $SSL_FILE ]; then
if grep -q "$PATTERN" $SSL_FILE ; then
echo "rewrite rules already exist in file $SSL_FILE"
@ -71,6 +72,14 @@ config_apache2_conf() {
sed -i -e "s/<\/VirtualHost>/RewriteCond %{REQUEST_METHOD} =POST \n&/" $SSL_FILE
sed -i -e "s/<\/VirtualHost>/RewriteRule ^\/upload\/(.*) http:\/\/127.0.0.1:8210\/upload?uuid=\$1 [P,L] \n&/" $SSL_FILE
fi
if grep -q "$CORS_PATTERN" $SSL_FILE ; then
echo "cors rules already exist in file $SSL_FILE"
else
echo "adding cors rules to file: $SSL_FILE"
sed -i -e "s/<\/VirtualHost>/Header always set Access-Control-Allow-Origin \"*\" \n&/" $SSL_FILE
sed -i -e "s/<\/VirtualHost>/Header always set Access-Control-Allow-Methods \"POST, OPTIONS\" \n&/" $SSL_FILE
sed -i -e "s/<\/VirtualHost>/Header always set Access-Control-Allow-Headers \"x-requested-with, Content-Type, origin, authorization, accept, client-security-token, x-signature, x-metadata, x-expires\" \n&/" $SSL_FILE
fi
fi
}

View File

@ -454,28 +454,25 @@
args.response.success({
url: uploadparams.postURL,
ajaxPost: true,
data: {
signature: uploadparams.signature,
expires: uploadparams.expires,
metadata: uploadparams.metadata
'X-signature': uploadparams.signature,
'X-expires': uploadparams.expires,
'X-metadata': uploadparams.metadata
}
});
cloudStack.dialog.notice({
message: "This volume file has been uploaded. Please check its status at Stroage menu > Volumes > " + args.data.name + " > Status field."
});
}
});
},
postUpload: function(args) {
console.log("postUpload() is hit");
// Called when upload is done to do
// verification checks;
// i.e., poll the server to verify successful upload
//
// success() will close the dialog and call standard action
// error() will keep dialog open if user wants to re-submit
args.response.success();
if(args.error) {
args.response.error(args.errorMsg);
} else {
cloudStack.dialog.notice({
message: "This volume file has been uploaded. Please check its status at Stroage menu > Volumes > " + args.data.name + " > Status field."
});
args.response.success();
}
}
},
fields: {

View File

@ -636,48 +636,30 @@
data: data,
async: false,
success: function(json) {
/*
{
"postuploadtemplateresponse": {
"getuploadparams": {
"id": "d5bdaf23-dcb9-4eef-9b94-81870490f457",
"postURL": "https://10.223.67.4/upload/d5bdaf23-dcb9-4eef-9b94-81870490f457",
"metadata": "7jCvmzKuMBStM/qEjx9HjSAISd+f3VAUqC9CkYmq92O+SznYov415LUndZ4KuLAtGNY37VeePs8X+0oyaVSj+cjD+KKoBJuynjBJViAQQYKT/amcOdrkloBA4DgNEAn16p32Z2qI4+Ky1ecDAtg1vkYNoz9ReaKbehM3n5MIFPonhnYBEmbVSZkCIbVbJeh+vmYs9Y3SHtcG+0gWiU06YQ4KGl7Wc03wp3wusAlj7+L+fEBha54Rx+C7aS6UPZgm8/+atUUric6xiGMsx603NUElcLWE+gQ7PTimsIr6ySvcmc3D0n6JK6A7bc72sfPrHEbnNPD+5+qXJsBcXPLtEAG2WwduarwZ",
"timeout": "2015-01-20T01:01:02.548Z",
"signature": "NLXv5YsNuUn7NKC+ZP5JtSM26MY="
}
}
}
*/
var uploadparams = json.postuploadtemplateresponse.getuploadparams; //son.postuploadtemplateresponse.getuploadparams is an object, not an array of object.
var uploadparams = json.postuploadtemplateresponse.getuploadparams;
var templateId = uploadparams.id;
args.response.success({
url: uploadparams.postURL,
ajaxPost: true,
data: {
signature: uploadparams.signature,
expires: uploadparams.timeout,
metadata: uploadparams.metadata
'X-signature': uploadparams.signature,
'X-expires': uploadparams.expires,
'X-metadata': uploadparams.metadata
}
});
cloudStack.dialog.notice({
message: "This template file has been uploaded. Please check its status at Templates menu > " + args.data.name + " > Zones tab > click a zone > Status field and Ready field."
});
}
});
},
postUpload: function(args) {
console.log("postUpload() is hit");
// Called when upload is done to do
// verification checks;
// i.e., poll the server to verify successful upload
//
// success() will close the dialog and call standard action
// error() will keep dialog open if user wants to re-submit
args.response.success();
if(args.error) {
args.response.error(args.errorMsg);
} else {
cloudStack.dialog.notice({
message: "This template file has been uploaded. Please check its status at Templates menu > " + args.data.name + " > Zones tab > click a zone > Status field and Ready field."
});
args.response.success();
}
}
},
fields: {

View File

@ -690,76 +690,103 @@
context: args.context,
response: {
success: function(successArgs) {
//
// Move file field into iframe; keep visible for consistency
//
var $uploadFrame = $('<iframe>');
var $frameForm = $('<form>').attr({
method: 'POST',
action: successArgs.url,
enctype: 'multipart/form-data'
});
var $file = $form.find('input[type=file]');
var $field = $file.closest('.form-item .value');
// Add additional passed data
$.map(successArgs.data, function(v, k) {
var $hidden = $('<input>').attr({
type: 'hidden',
name: k,
value: v
});
var postUploadArgs = {
$form: $form,
data: data,
context: args.context,
response: {
success: function() {
args.after({
data: data,
ref: args.ref, // For backwards compatibility; use context
context: args.context,
$form: $form
});
$hidden.appendTo($frameForm);
});
console.log("The following object is a hidden HTML form that will submit local file with hidden field signature/expires/metadata:");
console.log($frameForm);
$uploadFrame.css({ width: $field.outerWidth(), height: $field.height() }).show();
$frameForm.append($file);
$field.append($uploadFrame);
$uploadFrame.contents().find('html body').append($frameForm);
$frameForm.submit(function() {
console.log("callback() in $frameForm.submit(callback(){}) is triggered");
$uploadFrame.load(function() {
console.log("callback() in $uploadFrame.load(callback(){}) is triggered");
args.form.fileUpload.postUpload({
$form: $form,
formData: data,
context: args.context,
response: {
success: function() {
args.after({
data: data,
ref: args.ref, // For backwards compatibility; use context
context: args.context,
$form: $form
});
$('div.overlay').remove();
$form.find('.loading-overlay').remove();
$('div.loading-overlay').remove();
$('div.overlay').remove();
$form.find('.loading-overlay').remove();
$('div.loading-overlay').remove();
$('.tooltip-box').remove();
$formContainer.remove();
$(this).dialog('destroy');
$('.tooltip-box').remove();
$formContainer.remove();
$(this).dialog('destroy');
$('.hovered-elem').hide();
},
error: function(msg) {
$('div.overlay').remove();
$form.find('.loading-overlay').remove();
$('div.loading-overlay').remove();
cloudStack.dialog.error({ message: msg });
}
$('.hovered-elem').hide();
},
error: function(msg) {
$('div.overlay').remove();
$form.find('.loading-overlay').remove();
$('div.loading-overlay').remove();
cloudStack.dialog.error({ message: msg });
}
}
};
var postUploadArgsWithStatus = $.extend(true, {}, postUploadArgs);
if(successArgs.ajaxPost) {
var request = new FormData();
request.append('file', $file.prop("files")[0]);
$.ajax({
type: 'POST',
url: successArgs.url,
data: request,
dataType : 'html',
processData: false,
contentType: false,
headers: successArgs.data,
success: function(r) {
postUploadArgsWithStatus.error = false;
args.form.fileUpload.postUpload(postUploadArgsWithStatus);
},
error: function(r) {
postUploadArgsWithStatus.error = true;
postUploadArgsWithStatus.errorMsg = r.responseText;
args.form.fileUpload.postUpload(postUploadArgsWithStatus);
}
});
} else {
//
// Move file field into iframe; keep visible for consistency
//
var $uploadFrame = $('<iframe>');
var $frameForm = $('<form>').attr({
method: 'POST',
action: successArgs.url,
enctype: 'multipart/form-data'
});
return true;
});
$frameForm.submit();
var $field = $file.closest('.form-item .value');
// Add additional passed data
$.map(successArgs.data, function(v, k) {
var $hidden = $('<input>').attr({
type: 'hidden',
name: k,
value: v
});
$hidden.appendTo($frameForm);
});
console.log("The following object is a hidden HTML form that will submit local file with hidden field signature/expires/metadata:");
console.log($frameForm);
$uploadFrame.css({ width: $field.outerWidth(), height: $field.height() }).show();
$frameForm.append($file);
$field.append($uploadFrame);
$uploadFrame.contents().find('html body').append($frameForm);
$frameForm.submit(function() {
console.log("callback() in $frameForm.submit(callback(){}) is triggered");
$uploadFrame.load(function() {
console.log("callback() in $uploadFrame.load(callback(){}) is triggered");
args.form.fileUpload.postUpload(postUploadArgs);
});
return true;
});
$frameForm.submit();
}
},
error: function(msg) {
cloudStack.dialog.error({ message: msg });