diff --git a/src/sunstone/public/app/utils/vcenter/templates.js b/src/sunstone/public/app/utils/vcenter/templates.js index 539d2f556e..692078fe41 100644 --- a/src/sunstone/public/app/utils/vcenter/templates.js +++ b/src/sunstone/public/app/utils/vcenter/templates.js @@ -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) { }); }); } -}); \ No newline at end of file +}); diff --git a/src/sunstone/routes/vcenter.rb b/src/sunstone/routes/vcenter.rb index f2cee47c79..26c4ed11d2 100644 --- a/src/sunstone/routes/vcenter.rb +++ b/src/sunstone/routes/vcenter.rb @@ -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 diff --git a/src/sunstone/sunstone-server.rb b/src/sunstone/sunstone-server.rb index 96f74f647f..922ac715a7 100755 --- a/src/sunstone/sunstone-server.rb +++ b/src/sunstone/sunstone-server.rb @@ -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 diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb index 6706b18258..06835489be 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -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"]