From: Imre Farkas ifarkas@redhat.com
https://bugzilla.redhat.com/show_bug.cgi?id=786535
Rebased and autoupdate moved to mustache --- src/app/controllers/deployments_controller.rb | 2 +- src/app/helpers/mustache_helper.rb | 1 + src/app/models/deployment.rb | 2 +- src/app/util/taskomatic.rb | 8 +++++ src/app/views/deployments/_alerts_show.html.haml | 24 +++++--------- .../deployments/_deployment_alerts.html.mustache | 34 ++++++++++++++++++++ src/public/javascripts/backbone/views.js | 33 +++++++++++++++++++ src/spec/models/deployment_spec.rb | 2 + 8 files changed, 88 insertions(+), 18 deletions(-) create mode 100644 src/app/views/deployments/_deployment_alerts.html.mustache
diff --git a/src/app/controllers/deployments_controller.rb b/src/app/controllers/deployments_controller.rb index 38be20a..3acab91 100644 --- a/src/app/controllers/deployments_controller.rb +++ b/src/app/controllers/deployments_controller.rb @@ -167,7 +167,7 @@ class DeploymentsController < ApplicationController require_privilege(Privilege::VIEW, @deployment) init_new_deployment_attrs save_breadcrumb(deployment_path(@deployment, :viewstate => viewstate_id), @deployment.name) - @failed_instances = @deployment.failed_instances + @failed_instances = @deployment.failed_instances.list(sort_column(Instance), sort_direction) if filter_view? @view = 'instances/list' params[:instances_preset_filter] = "" unless params[:instances_preset_filter] diff --git a/src/app/helpers/mustache_helper.rb b/src/app/helpers/mustache_helper.rb index 78a663e..fabe8e4 100644 --- a/src/app/helpers/mustache_helper.rb +++ b/src/app/helpers/mustache_helper.rb @@ -51,6 +51,7 @@ module MustacheHelper :translated_state => t("instances.states.#{instance.state}"), :public_addresses => instance.public_addresses.present? ? instance.public_addresses : I18n.t('deployments.pretty_view_show.no_ip_address'), :instance_key_present => instance.instance_key.present?, + :last_error => instance.last_error, :stop_enabled => available_actions.include?(InstanceTask::ACTION_STOP), :reboot_enabled => available_actions.include?(InstanceTask::ACTION_REBOOT), :owner => instance.owner.present? ? instance.owner.name : nil, diff --git a/src/app/models/deployment.rb b/src/app/models/deployment.rb index 78af946..77d4c70 100644 --- a/src/app/models/deployment.rb +++ b/src/app/models/deployment.rb @@ -472,7 +472,7 @@ class Deployment < ActiveRecord::Base end
def failed_instances - instances.select {|instance| instance.failed?} + instances.failed end
def update_state(changed_instance) diff --git a/src/app/util/taskomatic.rb b/src/app/util/taskomatic.rb index a7181dc..463f521 100644 --- a/src/app/util/taskomatic.rb +++ b/src/app/util/taskomatic.rb @@ -73,6 +73,14 @@ module Taskomatic rescue Exception => ex task.state = Task::STATE_FAILED task.message = ex.message + task.instance.update_attributes(:last_error => ex.message) + + # For RHEV-M, since we need to start up the instance after the vm has been created + # we also have to handle create_failed state events separately + if task.instance.state == Instance::STATE_STOPPED && task.action == InstanceTask::ACTION_START && + task.instance.provider_account.provider.provider_type.deltacloud_driver == 'rhevm' + task.instance.update_attributes(:state => Instance::STATE_CREATE_FAILED) + end ensure task.save! if Task.exists?(task.id) end diff --git a/src/app/views/deployments/_alerts_show.html.haml b/src/app/views/deployments/_alerts_show.html.haml index 6742e45..4d2c9de 100644 --- a/src/app/views/deployments/_alerts_show.html.haml +++ b/src/app/views/deployments/_alerts_show.html.haml @@ -1,16 +1,8 @@ -- if @failed_instances.count > 0 - %section.content-section.alerts.collapse_entity - %header - .section-controls - = link_to t("providers.edit.toggle_alerts"), "#", :class => 'collapse alerts' - %h2.alerts - =t 'alerts_label' - %span.label.badge.alert.count= @failed_instances.count - .content.collapsible - %dl.alerts - %ul - - @failed_instances.each do |inst| - %li.alert - %dt.subject.critical= inst.name - %dd.type=t 'alerts.instance_failure' - %dd.desc= "#{inst.last_error.blank? ? inst.state : inst.last_error}" +#deployment-alerts + = render :partial => 'deployment_alerts', + :mustache => { :failed_instance_exists => @failed_instances.count > 0, + :failed_instances_count => @failed_instances.count, + :failed_instances => @failed_instances.map{ |instance| instance_for_mustache(instance) } } + +%script#deploymentAlertTemplate{ :type => 'text/html' } + = render :partial => 'deployment_alerts' diff --git a/src/app/views/deployments/_deployment_alerts.html.mustache b/src/app/views/deployments/_deployment_alerts.html.mustache new file mode 100644 index 0000000..0be2690 --- /dev/null +++ b/src/app/views/deployments/_deployment_alerts.html.mustache @@ -0,0 +1,34 @@ +{{#failed_instance_exists}} + <section class="content-section alerts collapse_entity"> + <header> + <div class="section-controls"> + <%= link_to(t('providers.edit.toggle_alerts'), '#', :class => 'collapse alerts') %> + </div> + <h2 class="alerts"> + <%= t('alerts_label') %> + <span class="label badge alert count">{{failed_instances_count}}</span> + </h2> + </header> + <div class="content collapsible" style="display: block;"> + <dl class="alerts"> + <ul> + {{#failed_instances}} + <li class="alert"> + <dt class="subject critical">{{name}}</dt> + <dd class="type"><%= t('alerts.instance_failure') %></dd> + <dd class="desc"> + {{#last_error}} + {{last_error}} + {{/last_error}} + + {{^last_error}} + {{translated_state}} + {{/last_error}} + </dd> + </li> + {{/failed_instances}} + </ul> + </dl> + </div> + </section> +{{/failed_instance_exists}} diff --git a/src/public/javascripts/backbone/views.js b/src/public/javascripts/backbone/views.js index e3cf278..60b9de2 100644 --- a/src/public/javascripts/backbone/views.js +++ b/src/public/javascripts/backbone/views.js @@ -278,6 +278,39 @@ Conductor.Views.DeploymentsShow = Backbone.View.extend({ instanceCardsHtml += Mustache.to_html($template.html(), instance); }); $instances.html(instanceCardsHtml); + + var $alerts = this.$('#deployment-alerts'); + var alertsVisible = $alerts.find('.collapsible').length == 0 || $alerts.find('.collapsible').is(":visible") + var failedInstances = _.compact(_.map(this.collection.models, function(model) { + if(model.get('failed')) { + return model.toJSON(); + } + else { + return null; + } + })); + + // Render alerts + $alerts.empty(); + if(failedInstances.length == 0) return; + + var $deploymentAlertTemplate = $('#deploymentAlertTemplate'); + $alerts.html(Mustache.to_html($deploymentAlertTemplate.html(), { + 'failed_instance_exists' : failedInstances.length > 0, + 'failed_instances_count' : failedInstances.length, + 'failed_instances' : failedInstances + })); + + // Add callback to Toggle link + $alerts.find('a.collapse').click(function(e) { + e.preventDefault(); + $(this).parents('.collapse_entity').find('.collapsible').slideToggle(80); + }); + + // Restore toggle state on alerts table + if(!alertsVisible) { + $alerts.find('.collapsible').hide(); + } }
}); diff --git a/src/spec/models/deployment_spec.rb b/src/spec/models/deployment_spec.rb index 7cf64f2..cc5cced 100644 --- a/src/spec/models/deployment_spec.rb +++ b/src/spec/models/deployment_spec.rb @@ -337,6 +337,8 @@ describe Deployment do @deployment.reload
@deployment.stop_instances_and_destroy! + inst1.reload + inst2.reload
# this emulates Condor stopping the actual instances # and dbomatic reflecting the changes back to Conductor
On 05/23/2012 02:16 PM, ifarkas@redhat.com wrote:
From: Imre Farkas ifarkas@redhat.com
https://bugzilla.redhat.com/show_bug.cgi?id=786535
Rebased and autoupdate moved to mustache
src/app/controllers/deployments_controller.rb | 2 +- src/app/helpers/mustache_helper.rb | 1 + src/app/models/deployment.rb | 2 +- src/app/util/taskomatic.rb | 8 +++++ src/app/views/deployments/_alerts_show.html.haml | 24 +++++--------- .../deployments/_deployment_alerts.html.mustache | 34 ++++++++++++++++++++ src/public/javascripts/backbone/views.js | 33 +++++++++++++++++++ src/spec/models/deployment_spec.rb | 2 + 8 files changed, 88 insertions(+), 18 deletions(-) create mode 100644 src/app/views/deployments/_deployment_alerts.html.mustache
diff --git a/src/app/controllers/deployments_controller.rb b/src/app/controllers/deployments_controller.rb index 38be20a..3acab91 100644 --- a/src/app/controllers/deployments_controller.rb +++ b/src/app/controllers/deployments_controller.rb @@ -167,7 +167,7 @@ class DeploymentsController < ApplicationController require_privilege(Privilege::VIEW, @deployment) init_new_deployment_attrs save_breadcrumb(deployment_path(@deployment, :viewstate => viewstate_id), @deployment.name)
- @failed_instances = @deployment.failed_instances
- @failed_instances = @deployment.failed_instances.list(sort_column(Instance), sort_direction) if filter_view? @view = 'instances/list' params[:instances_preset_filter] = "" unless params[:instances_preset_filter]
diff --git a/src/app/helpers/mustache_helper.rb b/src/app/helpers/mustache_helper.rb index 78a663e..fabe8e4 100644 --- a/src/app/helpers/mustache_helper.rb +++ b/src/app/helpers/mustache_helper.rb @@ -51,6 +51,7 @@ module MustacheHelper :translated_state => t("instances.states.#{instance.state}"), :public_addresses => instance.public_addresses.present? ? instance.public_addresses : I18n.t('deployments.pretty_view_show.no_ip_address'), :instance_key_present => instance.instance_key.present?,
:last_error => instance.last_error, :stop_enabled => available_actions.include?(InstanceTask::ACTION_STOP), :reboot_enabled => available_actions.include?(InstanceTask::ACTION_REBOOT), :owner => instance.owner.present? ? instance.owner.name : nil,
diff --git a/src/app/models/deployment.rb b/src/app/models/deployment.rb index 78af946..77d4c70 100644 --- a/src/app/models/deployment.rb +++ b/src/app/models/deployment.rb @@ -472,7 +472,7 @@ class Deployment < ActiveRecord::Base end
def failed_instances
- instances.select {|instance| instance.failed?}
instances.failed end
def update_state(changed_instance)
diff --git a/src/app/util/taskomatic.rb b/src/app/util/taskomatic.rb index a7181dc..463f521 100644 --- a/src/app/util/taskomatic.rb +++ b/src/app/util/taskomatic.rb @@ -73,6 +73,14 @@ module Taskomatic rescue Exception => ex task.state = Task::STATE_FAILED task.message = ex.message
task.instance.update_attributes(:last_error => ex.message)
# For RHEV-M, since we need to start up the instance after the vm has been created
# we also have to handle create_failed state events separately
if task.instance.state == Instance::STATE_STOPPED && task.action == InstanceTask::ACTION_START &&
task.instance.provider_account.provider.provider_type.deltacloud_driver == 'rhevm'
task.instance.update_attributes(:state => Instance::STATE_CREATE_FAILED)
end ensure task.save! if Task.exists?(task.id) end
diff --git a/src/app/views/deployments/_alerts_show.html.haml b/src/app/views/deployments/_alerts_show.html.haml index 6742e45..4d2c9de 100644 --- a/src/app/views/deployments/_alerts_show.html.haml +++ b/src/app/views/deployments/_alerts_show.html.haml @@ -1,16 +1,8 @@ -- if @failed_instances.count > 0
- %section.content-section.alerts.collapse_entity
- %header
.section-controls
= link_to t("providers.edit.toggle_alerts"), "#", :class => 'collapse alerts'
%h2.alerts
=t 'alerts_label'
%span.label.badge.alert.count= @failed_instances.count
- .content.collapsible
%dl.alerts
%ul
- @failed_instances.each do |inst|
%li.alert
%dt.subject.critical= inst.name
%dd.type=t 'alerts.instance_failure'
%dd.desc= "#{inst.last_error.blank? ? inst.state : inst.last_error}"
+#deployment-alerts
- = render :partial => 'deployment_alerts',
:mustache => { :failed_instance_exists => @failed_instances.count > 0,
:failed_instances_count => @failed_instances.count,
:failed_instances => @failed_instances.map{ |instance| instance_for_mustache(instance) } }
+%script#deploymentAlertTemplate{ :type => 'text/html' }
- = render :partial => 'deployment_alerts'
diff --git a/src/app/views/deployments/_deployment_alerts.html.mustache b/src/app/views/deployments/_deployment_alerts.html.mustache new file mode 100644 index 0000000..0be2690 --- /dev/null +++ b/src/app/views/deployments/_deployment_alerts.html.mustache @@ -0,0 +1,34 @@ +{{#failed_instance_exists}}
<section class="content-section alerts collapse_entity">
<header>
<div class="section-controls">
<%= link_to(t('providers.edit.toggle_alerts'), '#', :class => 'collapse alerts') %>
</div>
<h2 class="alerts">
<%= t('alerts_label') %>
<span class="label badge alert count">{{failed_instances_count}}</span>
</h2>
</header>
<div class="content collapsible" style="display: block;">
<dl class="alerts">
<ul>
{{#failed_instances}}
<li class="alert">
<dt class="subject critical">{{name}}</dt>
<dd class="type"><%= t('alerts.instance_failure') %></dd>
<dd class="desc">
{{#last_error}}
{{last_error}}
{{/last_error}}
{{^last_error}}
{{translated_state}}
{{/last_error}}
</dd>
</li>
{{/failed_instances}}
</ul>
</dl>
</div>
</section>
+{{/failed_instance_exists}} diff --git a/src/public/javascripts/backbone/views.js b/src/public/javascripts/backbone/views.js index e3cf278..60b9de2 100644 --- a/src/public/javascripts/backbone/views.js +++ b/src/public/javascripts/backbone/views.js @@ -278,6 +278,39 @@ Conductor.Views.DeploymentsShow = Backbone.View.extend({ instanceCardsHtml += Mustache.to_html($template.html(), instance); }); $instances.html(instanceCardsHtml);
var $alerts = this.$('#deployment-alerts');
var alertsVisible = $alerts.find('.collapsible').length == 0 || $alerts.find('.collapsible').is(":visible")
var failedInstances = _.compact(_.map(this.collection.models, function(model) {
if(model.get('failed')) {
return model.toJSON();
}
else {
return null;
}
}));
// Render alerts
$alerts.empty();
if(failedInstances.length == 0) return;
var $deploymentAlertTemplate = $('#deploymentAlertTemplate');
$alerts.html(Mustache.to_html($deploymentAlertTemplate.html(), {
'failed_instance_exists' : failedInstances.length > 0,
'failed_instances_count' : failedInstances.length,
'failed_instances' : failedInstances
}));
// Add callback to Toggle link
$alerts.find('a.collapse').click(function(e) {
e.preventDefault();
$(this).parents('.collapse_entity').find('.collapsible').slideToggle(80);
});
// Restore toggle state on alerts table
if(!alertsVisible) {
$alerts.find('.collapsible').hide();
} }
});
diff --git a/src/spec/models/deployment_spec.rb b/src/spec/models/deployment_spec.rb index 7cf64f2..cc5cced 100644 --- a/src/spec/models/deployment_spec.rb +++ b/src/spec/models/deployment_spec.rb @@ -337,6 +337,8 @@ describe Deployment do @deployment.reload
@deployment.stop_instances_and_destroy!
inst1.reload
inst2.reload # this emulates Condor stopping the actual instances # and dbomatic reflecting the changes back to Conductor
ACK.
aeolus-devel@lists.fedorahosted.org