From: Imre Farkas <ifarkas(a)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
--
1.7.6.5