Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[EUWE] Backport for Fix for UI hangs if errors are encountered during Git Import #12995

Merged
merged 1 commit into from
Dec 5, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/assets/javascripts/application.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
//= require miq_application
//= require miq_change_stored_password
//= require miq_qe
//= require git_import
//= require automate_import_export
//= require dialog_field_refresh
//= require excanvas
Expand Down
17 changes: 6 additions & 11 deletions app/assets/javascripts/automate_import_export.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ var Automate = {

renderGitImport: function(branches, tags, gitRepoId, messages) {
clearMessages();
message = JSON.parse(messages).message;
messageLevel = JSON.parse(messages).level;
var message = messages.message;
var messageLevel = messages.level;

if (messageLevel === "error") {
showErrorMessage(message);
Expand All @@ -50,17 +50,14 @@ var Automate = {

var addToDropDown = function(identifier, child) {
$('select.git-' + identifier).append(
$('<option>', {
value: child,
text: child
})
$('<option>', {value: child, text: child})
);
};

$.each(JSON.parse(branches), function(index, child) {
$.each(branches, function(_index, child) {
addToDropDown('branches', child);
});
$.each(JSON.parse(tags), function(index, child) {
$.each(tags, function(_index, child) {
addToDropDown('tags', child);
});

Expand Down Expand Up @@ -169,9 +166,7 @@ var Automate = {

Automate.setUpGitRefreshClickHandlers();

$('.git-retreive-datastore').click(function() {
miqSparkleOn();
});
GitImport.retrieveDatastoreClickHandler();

$('.git-import-submit').click(function(event) {
event.preventDefault();
Expand Down
50 changes: 50 additions & 0 deletions app/assets/javascripts/git_import.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/* global miqSparkleOn miqSparkleOff showErrorMessage clearMessages */

var GitImport = {
TASK_POLL_TIMEOUT: 1500,

retrieveDatastoreClickHandler: function() {
$('.git-retrieve-datastore').click(function(event) {
event.preventDefault();
miqSparkleOn();
clearMessages();

$.post('retrieve_git_datastore', $('#retrieve-git-datastore-form').serialize(), function(data) {
var parsedData = JSON.parse(data);
var messages = parsedData.message;
if (messages && messages.level === 'error') {
showErrorMessage(messages.message);
miqSparkleOff();
} else {
GitImport.pollForGitTaskCompletion(parsedData);
}
});
});
},

pollForGitTaskCompletion: function(gitData) {
$.get('check_git_task', gitData, function(data) {
var parsedData = JSON.parse(data);
if (parsedData.state) {
setTimeout(GitImport.pollForGitTaskCompletion, GitImport.TASK_POLL_TIMEOUT, gitData);
} else {
GitImport.gitTaskCompleted(parsedData);
}
});
},

gitTaskCompleted: function(data) {
if (data.success) {
var postMessageData = {
git_repo_id: data.git_repo_id,
git_branches: data.git_branches,
git_tags: data.git_tags,
message: data.message
};

parent.postMessage(postMessageData, '*');
} else {
parent.postMessage({message: data.message}, '*');
}
},
};
3 changes: 1 addition & 2 deletions app/assets/javascripts/import.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ var ImportSetup = {

listenForGitPostMessages: function() {
window.addEventListener('message', function(event) {
var unencodedMessage = event.data.message.replace(/&quot;/g, '"');
var messageData = JSON.parse(unencodedMessage);
var messageData = event.data.message;

if (messageData.level === 'error') {
showErrorMessage(messageData.message);
Expand Down
91 changes: 54 additions & 37 deletions app/controllers/miq_ae_tools_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -200,57 +200,70 @@ def review_import
end

def retrieve_git_datastore
redirect_options = {:action => :review_git_import}
git_url = params[:git_url]
verify_ssl = params[:git_verify_ssl] == "true" ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
new_git_repo = false

if git_url.blank?
add_flash(_("Please provide a valid git URL"), :error)
response_json = {:message => @flash_array.first}
elsif !GitBasedDomainImportService.available?
add_flash(_("Please enable the git owner role in order to import git repositories"), :error)
response_json = {:message => @flash_array.first}
else
begin
git_repo = GitRepository.find_or_create_by!(:url => git_url) { new_git_repo = true }
git_repo.update_attributes(:verify_ssl => verify_ssl)
if params[:git_username] && params[:git_password]
git_repo.update_authentication(:values => {:userid => params[:git_username],
:password => params[:git_password]})
end
setup_results = git_repository_service.setup(
git_url,
params[:git_username],
params[:git_password],
params[:git_verify_ssl]
)
git_repo_id = setup_results[:git_repo_id]
new_git_repo = setup_results[:new_git_repo?]

task_options = {
:action => "Retrieve git repository",
:userid => current_user.userid
}
queue_options = {
:class_name => "GitRepository",
:method_name => "refresh",
:instance_id => git_repo.id,
:role => "git_owner",
:args => []
}

task_id = MiqTask.generic_action_with_callback(task_options, queue_options)
task = MiqTask.wait_for_taskid(task_id)

raise task.message unless task.status == "Ok"

branch_names = git_repo.git_branches.collect(&:name)
tag_names = git_repo.git_tags.collect(&:name)
redirect_options[:git_branches] = branch_names.to_json
redirect_options[:git_tags] = tag_names.to_json
redirect_options[:git_repo_id] = git_repo.id
flash_message = "Successfully found git repository, please choose a branch or tag"
add_flash(_(flash_message), :success)
task_id = git_based_domain_import_service.queue_refresh(git_repo_id)
response_json = {:task_id => task_id, :git_repo_id => git_repo_id, :new_git_repo => new_git_repo}
rescue => err
git_repo.destroy if git_repo && new_git_repo
add_flash(_("Error during repository fetch: #{err.message}"), :error)
add_flash(_("Error during repository setup: %{error_message}") % {:error_message => err.message}, :error)
response_json = {:message => @flash_array.first}
end
end

redirect_options[:message] = @flash_array.first.to_json
respond_to do |format|
format.js { render :json => response_json.to_json, :status => 200 }
end
end

redirect_to redirect_options
def check_git_task
task = MiqTask.find(params[:task_id])
json = if task.state != MiqTask::STATE_FINISHED
{:state => task.state}
else
git_repo = GitRepository.find(params[:git_repo_id])

if task.status == "Ok"
branch_names = git_repo.git_branches.collect(&:name)
tag_names = git_repo.git_tags.collect(&:name)
flash_message = "Successfully found git repository, please choose a branch or tag"
add_flash(_(flash_message), :success)
{
:git_branches => branch_names,
:git_tags => tag_names,
:git_repo_id => git_repo.id,
:success => true,
:message => @flash_array.first
}
else
git_repo.destroy if git_repo && params[:new_git_repo] != "false"
add_flash(_("Error during repository fetch: #{task.message}"), :error)
{
:success => false,
:message => @flash_array.first
}
end
end

respond_to do |format|
format.js { render :json => json.to_json, :status => 200 }
end
end

def review_git_import
Expand Down Expand Up @@ -324,6 +337,10 @@ def git_based_domain_import_service
@git_based_domain_import_service ||= GitBasedDomainImportService.new
end

def git_repository_service
@git_repository_service ||= GitRepositoryService.new
end

def add_stats(stats_hash)
stats_hash.inject(0) do |result, key_value|
result + key_value[1]
Expand Down
15 changes: 15 additions & 0 deletions app/services/git_repository_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class GitRepositoryService
def setup(git_url, git_username, git_password, verify_ssl)
new_git_repo = false
git_repo = GitRepository.find_or_create_by!(:url => git_url) { new_git_repo = true }
git_repo.update_attributes(
:verify_ssl => verify_ssl == "true" ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
)

if git_username && git_password
git_repo.update_authentication(:values => {:userid => git_username, :password => git_password})
end

return {:git_repo_id => git_repo.id, :new_git_repo? => new_git_repo}
end
end
5 changes: 3 additions & 2 deletions app/views/miq_ae_tools/_import_export.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@
= _('Import Datastore via git')
= form_tag({:action => "retrieve_git_datastore"},
:target => "upload_target",
:method => :post) do
:method => :post,
:id => "retrieve-git-datastore-form") do
.form-horizontal
.form-group
%label.col-sm-2.control-label
Expand All @@ -54,7 +55,7 @@
.col-md-8
= submit_tag(_("Submit"),
:id => "git-url-import",
:class => "git-retreive-datastore btn btn-default",
:class => "git-retrieve-datastore btn btn-default",
:disabled => !git_import_button_enabled?)
= git_import_submit_help

Expand Down
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1877,6 +1877,7 @@
:miq_ae_tools => {
:get => %w(
automate_json
check_git_task
export_datastore
fetch_log
import_export
Expand Down
Loading