1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-23 22:50:09 +03:00

B #5429: Linked clones are always created when importing templates

(cherry picked from commit bbd05b3785ee88d5bed398406e2446bbdff3ea7e)
This commit is contained in:
Jaime Melis 2017-10-04 15:39:15 +02:00
parent 59ef8a193e
commit f533249494
4 changed files with 63 additions and 87 deletions

View File

@ -407,7 +407,6 @@ define(function(require) {
getNext();
}
function _import(context) {
that = this;
$.each($(".vcenter_import_table", context), function() {
@ -429,9 +428,10 @@ define(function(require) {
var templateName = $('.template_name', rpInput).val();
var vcenter_ref = $(this).data("import_data").vcenter_ref;
if(linkedClone){
if (linkedClone) {
var linked = true;
if(createCopy && templateName != ""){
if (createCopy && templateName != "") {
var copy = true;
var template_name = templateName;
} else {
@ -474,6 +474,10 @@ define(function(require) {
template += "\nUSER_INPUTS=[\n" + userInputs.join(",\n") + "]";
}
if (linked) {
template += "\nVCENTER_LINKED_CLONES=\"YES\"";
}
if($(this).data("import_data").import_disks_and_nics){
var template_json = {
"vmtemplate": { "template_raw": template }
@ -506,9 +510,11 @@ define(function(require) {
dataType: "json",
success: function(response){
var disks_and_nets = response.disks.concat(response.nics);
var template_json = {
"vmtemplate": { "template_raw": response.one }
};
if(response.create_copy){
OpenNebulaTemplate.del({
timeout: true,
@ -591,4 +597,4 @@ define(function(require) {
});
});
}
});
});

View File

@ -27,7 +27,6 @@ MAX_VCENTER_PASSWORD_LENGTH = 22 #This is the maximum length for a vCenter passw
require 'vcenter_driver'
helpers do
def vcenter_client
hpref = "HTTP-"
@ -79,7 +78,12 @@ helpers do
:user => vuser,
:password => vpass,
:host => vhost})
end
def return_error(code, msg)
logger.error("[vCenter] " + msg.to_s)
error = Error.new(msg.to_s)
error code, error.to_json
end
# def af_format_response(resp)
@ -237,23 +241,22 @@ end
get '/vcenter/template/:vcenter_ref/:template_id' do
begin
t = {}
t[:one] = ""
template_copy_ref = nil
template = nil
append = true
lc_error = nil
ref = params[:vcenter_ref]
template_id = params[:template_id]
t[:one] = ""
template_copy_ref = nil
template = nil
append = true
lc_error = nil
ref = params[:vcenter_ref]
template_id = params[:template_id]
use_linked_clones = params[:use_linked_clones] != "false"
create_copy = params[:create_copy] != "false"
template_name = params[:template_name] || ""
create_copy = params[:create_copy] != "false"
template_name = params[:template_name] || ""
if !ref || ref.empty?
msg = "No template ref specified"
logger.error("[vCenter] " + msg)
error = Error.new(msg)
error 404, error.to_json
return_error(404, msg)
end
template = VCenterDriver::Template.new_from_ref(ref, vcenter_client)
@ -262,127 +265,95 @@ get '/vcenter/template/:vcenter_ref/:template_id' do
dpool = VCenterDriver::VIHelper.one_pool(OpenNebula::DatastorePool)
if dpool.respond_to?(:message)
msg = "Could not get OpenNebula DatastorePool: #{dpool.message}"
logger.error("[vCenter] " + msg)
error = Error.new(msg)
error 404, error.to_json
return_error(404, msg)
end
ipool = VCenterDriver::VIHelper.one_pool(OpenNebula::ImagePool)
if ipool.respond_to?(:message)
msg = "Could not get OpenNebula ImagePool: #{ipool.message}"
logger.error("[vCenter] " + msg)
error = Error.new(msg)
error 404, error.to_json
return_error(404, msg)
end
npool = VCenterDriver::VIHelper.one_pool(OpenNebula::VirtualNetworkPool)
if npool.respond_to?(:message)
msg = "Could not get OpenNebula VirtualNetworkPool: #{npool.message}"
logger.error("[vCenter] " + msg)
error = Error.new(msg)
error 404, error.to_json
return_error(404, msg)
end
hpool = VCenterDriver::VIHelper.one_pool(OpenNebula::HostPool)
if hpool.respond_to?(:message)
msg = "Could not get OpenNebula HostPool: #{hpool.message}"
logger.error("[vCenter] " + msg)
error = Error.new(msg)
error 404, error.to_json
return_error(404, msg)
end
# POST params
if !use_linked_clones && (create_copy || !template_name.empty?)
msg = "Should not set create template copy or template copy name if not using linked clones"
logger.error("[vCenter] " + msg)
error = Error.new(msg)
error 403, error.to_json
return_error(404, msg)
end
if use_linked_clones && !create_copy && !template_name.empty?
msg = "Should not set template copy name if create template copy hasn't been selected"
logger.error("[vCenter] " + msg)
error = Error.new(msg)
error 403, error.to_json
return_error(404, msg)
end
if create_copy
if use_linked_clones
if create_copy
lc_error, template_copy_ref = template.create_template_copy(template_name)
lc_error, template_copy_ref = template.create_template_copy(template_name)
if template_copy_ref
template = VCenterDriver::Template.new_from_ref(template_copy_ref, vcenter_client)
one_template = VCenterDriver::Template.get_xml_template(template, vc_uuid, vcenter_client, vcenter_client.vim.host, "Datacenter")
if template_copy_ref
template = VCenterDriver::Template.new_from_ref(template_copy_ref, vcenter_client)
one_template = VCenterDriver::Template.get_xml_template(template, vc_uuid, vcenter_client, vcenter_client.vim.host, "Datacenter")
if one_template
lc_error, use_lc = template.create_delta_disks
if !lc_error
one_template[:one] << "\nVCENTER_LINKED_CLONES=\"YES\"\n"
one_template[:create_copy] = "YES"
t = one_template
append = false # t[:one] replaces the current template
if one_template
lc_error, use_lc = template.create_delta_disks
if lc_error.nil?
one_template[:create_copy] = "YES"
one_template[:one] << "\nVCENTER_LINKED_CLONES=\"YES\"\n"
t = one_template
else
return_error(404, lc_error)
end
else
lc_error = "Could not obtain the info from the template's copy"
return_error(404, lc_error)
end
else
lc_error = "Could not obtain the info from the template's copy"
template.delete_template if template_copy_ref
end
end
else
lc_error, use_lc = template.create_delta_disks
if !lc_error
append = true
t[:one] << "\nVCENTER_LINKED_CLONES=\"YES\"\n" if use_lc
else
lc_error, use_lc = template.create_delta_disks
if lc_error && use_lc
return_error(404, lc_error)
end
end
end
# Create images or get disks information for template
error, template_disks = template.import_vcenter_disks(vc_uuid, dpool, ipool, true, template_id)
if !error.empty?
append = false
template.delete_template if template_copy_ref
msg = error
logger.error("[vCenter] " + msg)
error = Error.new(msg)
error 404, error.to_json
end
#t[:one] << template_disks
t[:disks] = template_disks
raise error if !error.empty?
template_moref = template_copy_ref ? template_copy_ref : ref
wild = false #We're importing templates not wild vms
# Create images or get nics information for template
error, template_nics = template.import_vcenter_nics(vc_uuid,
npool,
hpool,
vcenter_client.vim.host,
template_moref,
wild,
false,
true,
template["name"],
template_id)
if !error.empty?
append = false
template.delete_template if template_copy_ref
msg = error
logger.error("[vCenter] " + msg)
error = Error.new(msg)
error 404, error.to_json
end
#t[:one] << template_nics
t[:nics] = template_nics
raise error if !error.empty?
t[:disks] = template_disks
t[:nics] = template_nics
t[:lc_error] = lc_error
t[:append] = append
[200, t.to_json]
rescue Exception => e
template.delete_template if template_copy_ref
logger.error("[vCenter] " + e.message)
error = Error.new(e.message)
error 403, error.to_json
return_error(e.message, 403)
end
end

View File

@ -419,7 +419,7 @@ before do
client = $cloud_auth.client(session[:user], session[:active_zone_endpoint])
@SunstoneServer = SunstoneServer.new(client,$conf,logger)
@SunstoneServer = SunstoneServer.new(client, $conf, logger)
end
after do

View File

@ -753,7 +753,6 @@ class Template
end
def self.get_xml_template(template, vcenter_uuid, vi_client, vcenter_instance_name=nil, dc_name=nil, rp_cache={})
begin
template_ref = template['_ref']
template_name = template["name"]