mirror of
https://github.com/OpenNebula/one.git
synced 2025-02-02 09:47:00 +03:00
feature #2911: Add vCenter clusters and templates to the host create dialog
This commit is contained in:
parent
956b691878
commit
ad8b7d2c9c
@ -1546,7 +1546,8 @@ SUNSTONE_PUBLIC_JS_PLUGINS_FILES="\
|
|||||||
src/sunstone/public/js/plugins/support-tab.js \
|
src/sunstone/public/js/plugins/support-tab.js \
|
||||||
src/sunstone/public/js/plugins/zones-tab.js"
|
src/sunstone/public/js/plugins/zones-tab.js"
|
||||||
|
|
||||||
SUNSTONE_ROUTES_FILES="src/sunstone/routes/oneflow.rb"
|
SUNSTONE_ROUTES_FILES="src/sunstone/routes/oneflow.rb \
|
||||||
|
src/sunstone/routes/vcenter.rb"
|
||||||
|
|
||||||
# begin bower
|
# begin bower
|
||||||
|
|
||||||
|
@ -189,3 +189,4 @@
|
|||||||
|
|
||||||
:routes:
|
:routes:
|
||||||
- oneflow
|
- oneflow
|
||||||
|
- vcenter
|
||||||
|
@ -127,21 +127,33 @@ var create_host_tmpl =
|
|||||||
<div class="row vcenter_credentials hidden">\
|
<div class="row vcenter_credentials hidden">\
|
||||||
<fieldset>\
|
<fieldset>\
|
||||||
<legend>'+tr("vCenter")+'</legend>\
|
<legend>'+tr("vCenter")+'</legend>\
|
||||||
<div class="large-6 columns">\
|
<div class="row">\
|
||||||
<label for="vcenter_user">' + tr("User") + '</label>\
|
<div class="large-6 columns">\
|
||||||
<input type="text" name="vcenter_user" id="vcenter_user" />\
|
<label for="vcenter_user">' + tr("User") + '</label>\
|
||||||
|
<input type="text" name="vcenter_user" id="vcenter_user" />\
|
||||||
|
</div>\
|
||||||
|
<div class="large-6 columns">\
|
||||||
|
<label for="vcenter_host">' + tr("Hostname") + '</label>\
|
||||||
|
<input type="text" name="vcenter_host" id="vcenter_host" />\
|
||||||
|
</div>\
|
||||||
</div>\
|
</div>\
|
||||||
<div class="large-6 columns">\
|
<div class="row">\
|
||||||
<label for="vcenter_host">' + tr("Hostname") + '</label>\
|
<div class="large-6 columns">\
|
||||||
<input type="text" name="vcenter_host" id="vcenter_host" />\
|
<label for="vcenter_password">' + tr("Password") + '</label>\
|
||||||
|
<input type="password" name="vcenter_password" id="vcenter_password" />\
|
||||||
|
</div>\
|
||||||
|
<div class="large-6 columns">\
|
||||||
|
<br>\
|
||||||
|
<a class="button radius small right" id="get_vcenter_clusters">'+tr("Get vCenter Clusters")+'</a>\
|
||||||
|
</div>\
|
||||||
</div>\
|
</div>\
|
||||||
<div class="large-6 columns">\
|
<div class="vcenter_clusters">\
|
||||||
<label for="vcenter_password">' + tr("Password") + '</label>\
|
|
||||||
<input type="text" name="vcenter_password" id="vcenter_password" />\
|
|
||||||
</div>\
|
</div>\
|
||||||
<div class="large-6 columns">\
|
<div class="row import_vcenter_clusters_div hidden">\
|
||||||
<br>\
|
<div class="large-12 columns">\
|
||||||
<a class="button radius small right">'+tr("Get vCenter Clusters")+'</a>\
|
<br>\
|
||||||
|
<a class="button radius small right success" id="import_vcenter_clusters">'+tr("Import vCenter Clusters and Templates")+'</a>\
|
||||||
|
</div>\
|
||||||
</div>\
|
</div>\
|
||||||
</fieldset>\
|
</fieldset>\
|
||||||
</div>\
|
</div>\
|
||||||
@ -955,6 +967,12 @@ function setupCreateHostDialog(){
|
|||||||
$create_host_dialog.addClass("reveal-modal medium").attr("data-reveal", "");
|
$create_host_dialog.addClass("reveal-modal medium").attr("data-reveal", "");
|
||||||
$create_host_dialog.foundation()
|
$create_host_dialog.foundation()
|
||||||
|
|
||||||
|
$("#wizard_host_reset_button", $create_host_dialog).on("click", function(){
|
||||||
|
$('#create_host_dialog').html("");
|
||||||
|
setupCreateHostDialog();
|
||||||
|
popUpCreateHostDialog();
|
||||||
|
})
|
||||||
|
|
||||||
$(".drivers", $create_host_dialog).hide();
|
$(".drivers", $create_host_dialog).hide();
|
||||||
|
|
||||||
$("#host_type_mad", $create_host_dialog).on("change", function(){
|
$("#host_type_mad", $create_host_dialog).on("change", function(){
|
||||||
@ -964,21 +982,149 @@ function setupCreateHostDialog(){
|
|||||||
if (this.value == "custom") {
|
if (this.value == "custom") {
|
||||||
$(".vcenter_credentials", $create_host_dialog).hide();
|
$(".vcenter_credentials", $create_host_dialog).hide();
|
||||||
$("#vnm_mads", $create_host_dialog).show();
|
$("#vnm_mads", $create_host_dialog).show();
|
||||||
$("#create_host_submit", $create_host_dialog).removeAttr("disabled");
|
$("#create_host_submit", $create_host_dialog).show();
|
||||||
$(".drivers", $create_host_dialog).show();
|
$(".drivers", $create_host_dialog).show();
|
||||||
} else if (this.value == "vcenter") {
|
} else if (this.value == "vcenter") {
|
||||||
$("#vnm_mads", $create_host_dialog).hide();
|
$("#vnm_mads", $create_host_dialog).hide();
|
||||||
$(".vcenter_credentials", $create_host_dialog).show();
|
$(".vcenter_credentials", $create_host_dialog).show();
|
||||||
$("#create_host_submit", $create_host_dialog).attr("disabled", "disabled");
|
$("#create_host_submit", $create_host_dialog).hide();
|
||||||
$(".drivers", $create_host_dialog).hide();
|
$(".drivers", $create_host_dialog).hide();
|
||||||
} else {
|
} else {
|
||||||
$(".vcenter_credentials", $create_host_dialog).hide();
|
$(".vcenter_credentials", $create_host_dialog).hide();
|
||||||
$("#vnm_mads", $create_host_dialog).show();
|
$("#vnm_mads", $create_host_dialog).show();
|
||||||
$("#create_host_submit", $create_host_dialog).removeAttr("disabled");
|
$("#create_host_submit", $create_host_dialog).show();
|
||||||
$(".drivers", $create_host_dialog).hide();
|
$(".drivers", $create_host_dialog).hide();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
$("#get_vcenter_clusters", $create_host_dialog).on("click", function(){
|
||||||
|
// TODO notify if credentials empty
|
||||||
|
$(".vcenter_clusters", $create_host_dialog).html(
|
||||||
|
'<span class="fa-stack fa-2x" style="color: #dfdfdf">'+
|
||||||
|
'<i class="fa fa-cloud fa-stack-2x"></i>'+
|
||||||
|
'<i class="fa fa-spinner fa-spin fa-stack-1x fa-inverse"></i>'+
|
||||||
|
'</span>')
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: '/vcenter',
|
||||||
|
type: "GET",
|
||||||
|
//data: {timeout: timeout},
|
||||||
|
dataType: "json",
|
||||||
|
headers: {
|
||||||
|
"X_VCENTER_USER": $("#vcenter_user", $create_host_dialog).val(),
|
||||||
|
"X_VCENTER_PASSWORD": $("#vcenter_password", $create_host_dialog).val(),
|
||||||
|
"X_VCENTER_HOST": $("#vcenter_host", $create_host_dialog).val()
|
||||||
|
},
|
||||||
|
success: function(response){
|
||||||
|
console.log(response);
|
||||||
|
$("#get_vcenter_clusters", $create_host_dialog).hide();
|
||||||
|
$(".import_vcenter_clusters_div", $create_host_dialog).show();
|
||||||
|
|
||||||
|
var vcenter_container = $(".vcenter_clusters", $create_host_dialog);
|
||||||
|
vcenter_container.html("");
|
||||||
|
|
||||||
|
$('<div class="row">' +
|
||||||
|
'<div class="large-12 columns">' +
|
||||||
|
'<h5>' +
|
||||||
|
datacenter_name + ' ' + tr("Clusters") +
|
||||||
|
'</h5>' +
|
||||||
|
'</div>' +
|
||||||
|
'</div>').appendTo(vcenter_container)
|
||||||
|
|
||||||
|
$.each(response, function(datacenter_name, clusters){
|
||||||
|
$('<div class="row">' +
|
||||||
|
'<div class="large-12 columns">' +
|
||||||
|
'<span style="color: #999">' + tr("Please select the vCenter Clusters and Templates to be imported to OpenNebula. Each vCenter Cluster will be included as a new OpenNebula Host") + '</span>' +
|
||||||
|
'</div>' +
|
||||||
|
'</div>').appendTo(vcenter_container)
|
||||||
|
|
||||||
|
if (clusters.length == 0) {
|
||||||
|
$('<div class="row">' +
|
||||||
|
'<div class="large-12 columns">' +
|
||||||
|
'<label>' +
|
||||||
|
tr("No clusters found in this DataCenter") +
|
||||||
|
'</label>' +
|
||||||
|
'</div>' +
|
||||||
|
'</div>').appendTo(vcenter_container)
|
||||||
|
} else {
|
||||||
|
$.each(clusters, function(id, cluster_name){
|
||||||
|
var row = $('<div class="vcenter_cluster">' +
|
||||||
|
'<div class="row">' +
|
||||||
|
'<div class="large-12 columns">' +
|
||||||
|
'<label>' +
|
||||||
|
'<input type="checkbox" class="cluster_name"/> ' +
|
||||||
|
cluster_name +
|
||||||
|
'</label>' +
|
||||||
|
'</div>' +
|
||||||
|
'</div>'+
|
||||||
|
'<div class="vcenter_templates">'+
|
||||||
|
'</div>'+
|
||||||
|
'</div>').appendTo(vcenter_container)
|
||||||
|
|
||||||
|
$(".cluster_name", row).data("cluster_name", cluster_name)
|
||||||
|
$(".cluster_name", row).data("datacenter_name", datacenter_name)
|
||||||
|
$(".cluster_name", row).on("change", function(){
|
||||||
|
var path = '/vcenter/' + $(this).data("datacenter_name") + '/cluster/' + $(this).data("cluster_name");
|
||||||
|
var templates_container = $(".vcenter_templates", $(this).closest(".vcenter_cluster"))
|
||||||
|
templates_container.html(generateAdvancedSection({
|
||||||
|
html_id: path,
|
||||||
|
title: tr("Templates"),
|
||||||
|
content: '<span class="fa-stack fa-2x" style="color: #dfdfdf">'+
|
||||||
|
'<i class="fa fa-cloud fa-stack-2x"></i>'+
|
||||||
|
'<i class="fa fa-spinner fa-spin fa-stack-1x fa-inverse"></i>'+
|
||||||
|
'</span>'
|
||||||
|
}))
|
||||||
|
|
||||||
|
$('a', templates_container).trigger("click")
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: path,
|
||||||
|
type: "GET",
|
||||||
|
//data: {timeout: timeout},
|
||||||
|
dataType: "json",
|
||||||
|
headers: {
|
||||||
|
"X_VCENTER_USER": $("#vcenter_user", $create_host_dialog).val(),
|
||||||
|
"X_VCENTER_PASSWORD": $("#vcenter_password", $create_host_dialog).val(),
|
||||||
|
"X_VCENTER_HOST": $("#vcenter_host", $create_host_dialog).val()
|
||||||
|
},
|
||||||
|
success: function(response){
|
||||||
|
$(".content", templates_container).html("");
|
||||||
|
console.log(response);
|
||||||
|
$.each(response, function(id, template){
|
||||||
|
var trow = $('<div class="vcenter_template">' +
|
||||||
|
'<div class="row">' +
|
||||||
|
'<div class="large-12 columns">' +
|
||||||
|
'<label>' +
|
||||||
|
'<input type="checkbox" class="template_name"/> ' +
|
||||||
|
template.name + ' <span style="color: #999">' + template.uuid + '</span>' +
|
||||||
|
'</label>' +
|
||||||
|
'</div>' +
|
||||||
|
'</div>'+
|
||||||
|
'<div class="vcenter_templates">'+
|
||||||
|
'</div>'+
|
||||||
|
'</div>').appendTo($(".content", templates_container))
|
||||||
|
|
||||||
|
$(".template_name", trow).data("template_name", template.name)
|
||||||
|
$(".template_name", trow).data("one_template", template.one)
|
||||||
|
});
|
||||||
|
},
|
||||||
|
error: function(response){
|
||||||
|
onError({}, OpenNebula.Error(response));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
error: function(response){
|
||||||
|
onError({}, OpenNebula.Error(response));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return false;
|
||||||
|
})
|
||||||
|
|
||||||
// Show custom driver input only when custom is selected in selects
|
// Show custom driver input only when custom is selected in selects
|
||||||
$('input[name="custom_vmm_mad"],'+
|
$('input[name="custom_vmm_mad"],'+
|
||||||
'input[name="custom_im_mad"],'+
|
'input[name="custom_im_mad"],'+
|
||||||
@ -1047,8 +1193,8 @@ function popUpCreateHostDialog(){
|
|||||||
|
|
||||||
insertSelectOptions('#host_cluster_id',$('div#create_host_dialog'), "Cluster", cluster_id, false);
|
insertSelectOptions('#host_cluster_id',$('div#create_host_dialog'), "Cluster", cluster_id, false);
|
||||||
|
|
||||||
$('div#create_host_dialog').foundation('reveal', 'open');
|
$("#create_host_dialog").foundation('reveal', 'open');
|
||||||
$("input#name",$('div#create_host_dialog')).focus();
|
$("input#name",$("#create_host_dialog")).focus();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
89
src/sunstone/routes/vcenter.rb
Normal file
89
src/sunstone/routes/vcenter.rb
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
# -------------------------------------------------------------------------- #
|
||||||
|
# Copyright 2010-2014, C12G Labs S.L. #
|
||||||
|
# #
|
||||||
|
# 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. #
|
||||||
|
#--------------------------------------------------------------------------- #
|
||||||
|
|
||||||
|
if !ONE_LOCATION
|
||||||
|
REMOTES_LOCATION="/var/lib/one/remotes"
|
||||||
|
else
|
||||||
|
REMOTES_LOCATION=ONE_LOCATION+"/var/remotes"
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO vcenter_driver should be stored in RUBY_LIB_LOCATION
|
||||||
|
$: << REMOTES_LOCATION+"/vmm/vcenter/"
|
||||||
|
|
||||||
|
require 'vcenter_driver'
|
||||||
|
|
||||||
|
helpers do
|
||||||
|
def vcenter_client
|
||||||
|
vuser = request.env['HTTP_X_VCENTER_USER']
|
||||||
|
vpass = request.env['HTTP_X_VCENTER_PASSWORD']
|
||||||
|
vhost = request.env['HTTP_X_VCENTER_HOST']
|
||||||
|
|
||||||
|
if vuser.nil? || vpass.nil? || vhost.nil?
|
||||||
|
msg = "You have to provide the vCenter username, password and hostname"
|
||||||
|
logger.error("[vCenter] " + msg)
|
||||||
|
error = Error.new(msg)
|
||||||
|
error 404, error.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
return VCenterDriver::VIClient.new_connection(
|
||||||
|
:user => vuser,
|
||||||
|
:password => vpass,
|
||||||
|
:host => vhost)
|
||||||
|
end
|
||||||
|
|
||||||
|
# def af_format_response(resp)
|
||||||
|
# if CloudClient::is_error?(resp)
|
||||||
|
# logger.error("[OneFlow] " + resp.to_s)
|
||||||
|
#
|
||||||
|
# error = Error.new(resp.to_s)
|
||||||
|
# error resp.code.to_i, error.to_json
|
||||||
|
# else
|
||||||
|
# body resp.body.to_s
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
end
|
||||||
|
|
||||||
|
get '/vcenter' do
|
||||||
|
begin
|
||||||
|
rs = vcenter_client.hierarchy
|
||||||
|
[200, rs.to_json]
|
||||||
|
rescue Exception => e
|
||||||
|
logger.error("[vCenter] " + e.message)
|
||||||
|
error = Error.new(e.message)
|
||||||
|
error 403, error.to_json
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
get '/vcenter/:datacenter/cluster/:name' do
|
||||||
|
begin
|
||||||
|
rs = vcenter_client.vm_templates
|
||||||
|
|
||||||
|
templates = rs[params[:datacenter]]
|
||||||
|
if templates.nil?
|
||||||
|
msg = "Datacenter " + params[:datacenter] + "not found"
|
||||||
|
logger.error("[vCenter] " + msg)
|
||||||
|
error = Error.new(msg)
|
||||||
|
error 404, error.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
ctemplates = templates.select{|t| t[:host] == params[:name]}
|
||||||
|
[200, ctemplates.to_json]
|
||||||
|
rescue Exception => e
|
||||||
|
logger.error("[vCenter] " + e.message)
|
||||||
|
error = Error.new(e.message)
|
||||||
|
error 403, error.to_json
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user