cloud-toaster 1.1.5 → 1.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/Gemfile +5 -45
- data/README.md +2 -2
- data/VERSION +1 -1
- data/chef/cookbooks/lxc/recipes/setup_database.rb +12 -4
- data/chef/cookbooks/toaster/recipes/testing.rb +2 -2
- data/cloud-toaster.gemspec +94 -0
- data/config.json +3 -1
- data/lib/toaster/api.rb +25 -22
- data/lib/toaster/chef/chef_listener.rb +3 -3
- data/lib/toaster/chef/chef_node_inspector.rb +6 -4
- data/lib/toaster/chef/chef_util.rb +26 -8
- data/lib/toaster/chef/failsafe_resource_parser.rb +1 -0
- data/lib/toaster/chef/resource_inspector.rb +1 -1
- data/lib/toaster/model/automation.rb +26 -7
- data/lib/toaster/model/automation_run.rb +2 -11
- data/lib/toaster/model/key_value_pair.rb +13 -1
- data/lib/toaster/model/task.rb +3 -3
- data/lib/toaster/model/task_execution.rb +3 -2
- data/lib/toaster/model/task_parameter.rb +17 -24
- data/lib/toaster/state/convergence.rb +2 -2
- data/lib/toaster/state/idempotence.rb +13 -7
- data/lib/toaster/state/system_state.rb +1 -0
- data/lib/toaster/test/test_case.rb +10 -5
- data/lib/toaster/test/test_runner.rb +131 -124
- data/lib/toaster/test/test_suite.rb +1 -1
- data/lib/toaster/test_manager.rb +3 -9
- data/lib/toaster/toaster_app_service.rb +0 -4
- data/lib/toaster/util/config.rb +6 -1
- data/lib/toaster/util/lxc.rb +1 -1
- data/webapp/app/assets/javascripts/jstree.util.js +2 -1
- data/webapp/app/assets/stylesheets/application.css +21 -1
- data/webapp/app/assets/stylesheets/layout.css +1 -1
- data/webapp/app/controllers/analysis_controller.rb +12 -0
- data/webapp/app/controllers/application_controller.rb +11 -3
- data/webapp/app/controllers/base_controller.rb +1 -0
- data/webapp/app/controllers/execs_controller.rb +12 -4
- data/webapp/app/controllers/scripts_controller.rb +91 -52
- data/webapp/app/controllers/test_controller.rb +4 -4
- data/webapp/app/views/analysis/convergence.html.erb +14 -11
- data/webapp/app/views/analysis/idempotence.html.erb +40 -1
- data/webapp/app/views/analysis/index.html.erb +117 -0
- data/webapp/app/views/execs/automation_runs.html.erb +10 -4
- data/webapp/app/views/execs/task_executions.html.erb +20 -16
- data/webapp/app/views/layouts/application.html.erb +22 -9
- data/webapp/app/views/scripts/graph.html.erb +1 -1
- data/webapp/app/views/scripts/import_chef.html.erb +4 -0
- data/webapp/app/views/scripts/scripts.html.erb +5 -17
- data/webapp/app/views/settings/{index.html.erb → config.html.erb} +4 -6
- data/webapp/app/views/settings/containers.html.erb +7 -9
- data/webapp/app/views/test/gen.html.erb +1 -0
- data/webapp/app/views/test/suites.html.erb +1 -1
- data/webapp/app/views/util/chef.html.erb +2 -2
- data/webapp/config/initializers/devise.rb +4 -1
- data/webapp/config/routes.rb +15 -8
- data/webapp/log/development.log +39521 -0
- data/webapp/tmp/cache/assets/development/sprockets/0dc0562647e703ca0535da3b9fcad796 +0 -0
- data/webapp/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/webapp/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/webapp/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/webapp/tmp/cache/assets/development/sprockets/72cbfd5bf33945bcce154f7a4feaf04d +0 -0
- data/webapp/tmp/cache/assets/development/sprockets/7b2b7d9034fc7b77daf5da1436667e6f +0 -0
- data/webapp/tmp/cache/assets/development/sprockets/b6f1534bcdbff92a16c85487f363235a +0 -0
- data/webapp/tmp/cache/assets/development/sprockets/bfac6cd2984fbd5e0d762389e3c37164 +0 -0
- data/webapp/tmp/cache/assets/development/sprockets/c5907cfd07b24ad19b8c80e8af618a57 +0 -0
- data/webapp/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/webapp/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/webapp/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- metadata +53 -51
@@ -10,12 +10,12 @@ convs = {}
|
|
10
10
|
begin
|
11
11
|
|
12
12
|
show_all_link = false
|
13
|
-
automation =
|
14
|
-
if param('
|
13
|
+
automation = cur_auto
|
14
|
+
if param('task_id') != ""
|
15
15
|
tasks = [get_task_for_param()]
|
16
16
|
show_all_link = true
|
17
|
-
|
18
|
-
|
17
|
+
end
|
18
|
+
if automation
|
19
19
|
tasks = automation.get_globally_executed_tasks() if automation
|
20
20
|
end
|
21
21
|
|
@@ -31,9 +31,10 @@ end
|
|
31
31
|
end
|
32
32
|
|
33
33
|
%>
|
34
|
-
<
|
34
|
+
<h1>Convergence of System State</h1>
|
35
35
|
<form action="#" method="post">
|
36
36
|
<% if tasks %>
|
37
|
+
Selected automation UUID: <%= automation.uuid %>
|
37
38
|
<% if show_all_link %>
|
38
39
|
<ul>
|
39
40
|
<li>Currently only displaying convergence of a single task. <a href="<%= l('task' => '') %>">Show All Tasks</a>
|
@@ -41,7 +42,7 @@ end
|
|
41
42
|
</ul>
|
42
43
|
<% end %>
|
43
44
|
|
44
|
-
<
|
45
|
+
<h2>Track State Properties</h2>
|
45
46
|
Enter state property name patterns (one per line):<br/>
|
46
47
|
<textarea rows="3" cols="40" name="trackProps"><%=
|
47
48
|
param("trackProps") != "" ? param("trackProps") : ".*"
|
@@ -60,8 +61,10 @@ end
|
|
60
61
|
props << prop
|
61
62
|
end
|
62
63
|
exes = []
|
63
|
-
traces[run][props[0]]
|
64
|
-
|
64
|
+
if traces[run][props[0]]
|
65
|
+
traces[run][props[0]].collect do |tuple|
|
66
|
+
exes << tuple[0]
|
67
|
+
end
|
65
68
|
end
|
66
69
|
%>
|
67
70
|
<table class="tablesorter"><thead><tr>
|
@@ -106,7 +109,7 @@ end
|
|
106
109
|
post_states = Set.new(task.global_post_states_flat)
|
107
110
|
%>
|
108
111
|
<tr><td colspan="4">Task
|
109
|
-
<b><a href="
|
112
|
+
<b><a href="/scripts/<%= task.automation.id %>/tasks/<%= task.id %>"><%= task.name %></a></b>
|
110
113
|
</td></tr>
|
111
114
|
<%
|
112
115
|
{"PRE-state" => pre_states,
|
@@ -132,9 +135,9 @@ end
|
|
132
135
|
end
|
133
136
|
%>
|
134
137
|
|
135
|
-
<
|
138
|
+
<h2>State Convergence By Task</h2>
|
136
139
|
<% tasks.each do |task| %>
|
137
|
-
<h3>State Convergence of Task '<a href="
|
140
|
+
<h3>State Convergence of Task '<a href="/scripts/<%= task.automation.id %>/tasks/<%= task.id %>"><%= task.name %></a>'</h3>
|
138
141
|
<% task_convs = convs[task] ? convs[task] : []
|
139
142
|
if task_convs.empty? %>
|
140
143
|
No convergent state property found for this task.
|
@@ -1,2 +1,41 @@
|
|
1
1
|
<h1>Idempotence</h1>
|
2
|
-
|
2
|
+
<%
|
3
|
+
|
4
|
+
require 'toaster/state/idempotence'
|
5
|
+
require 'toaster/util/util'
|
6
|
+
|
7
|
+
auto = cur_auto
|
8
|
+
suite = cur_suite
|
9
|
+
non_idem = nil
|
10
|
+
if suite
|
11
|
+
auto = suite.automation
|
12
|
+
idem_check = Idempotence.new(suite)
|
13
|
+
non_idem = idem_check.non_idempotent_task_seq()
|
14
|
+
elsif auto
|
15
|
+
idem_check = Idempotence.new(auto)
|
16
|
+
non_idem = idem_check.non_idempotent_task_seq()
|
17
|
+
end
|
18
|
+
|
19
|
+
%>
|
20
|
+
|
21
|
+
<% if auto %>
|
22
|
+
Automation UUID: <%= auto.uuid %>
|
23
|
+
<% if suite %>
|
24
|
+
<br/>Test Suite UUID: <%= suite.uuid %>
|
25
|
+
<% end %>
|
26
|
+
<h2>Non-Idempotent Task Sequences</h2>
|
27
|
+
<table>
|
28
|
+
<thead>
|
29
|
+
<tr><th>ID</th><th>Task List</th></tr>
|
30
|
+
</thead>
|
31
|
+
<% non_idem.each_with_index do |seq,idx|
|
32
|
+
seq = seq.collect {|t|
|
33
|
+
"<a href=\"/scripts/#{t.automation.id}/tasks/#{t.id}\">#{t.resource}</a>"
|
34
|
+
}
|
35
|
+
%>
|
36
|
+
<tr><td><%= idx+1 %></td><td><%= seq.join(" → ").html_safe %></td></tr>
|
37
|
+
<% end %>
|
38
|
+
</table>
|
39
|
+
<% else %>
|
40
|
+
Please select an <b>automation</b> or a specific <b>test suite</b> to perform idempotence analysis.
|
41
|
+
<% end %>
|
@@ -0,0 +1,117 @@
|
|
1
|
+
<h1>Test Analysis</h1>
|
2
|
+
<h2>Automations</h2>
|
3
|
+
<%
|
4
|
+
|
5
|
+
require 'toaster/state/convergence'
|
6
|
+
require 'toaster/util/util'
|
7
|
+
require 'toaster/model/automation'
|
8
|
+
|
9
|
+
autos = Toaster::Automation.find()
|
10
|
+
auto = cur_auto
|
11
|
+
tasks = []
|
12
|
+
suite = suite
|
13
|
+
show_toaster_tasks = false
|
14
|
+
if cur_suite
|
15
|
+
auto = suite.automation
|
16
|
+
end
|
17
|
+
if auto
|
18
|
+
tasks = auto.tasks.to_a
|
19
|
+
end
|
20
|
+
|
21
|
+
%>
|
22
|
+
|
23
|
+
<table class="tablesorter">
|
24
|
+
<thead>
|
25
|
+
<tr>
|
26
|
+
<th>#</th><th>UUID</th><th>Name</th><th>Type</th><th>Tasks</th>
|
27
|
+
<th>Attributes</th><th>Runs</th><th>State Changes</th><th colspan="6">Actions</th></tr>
|
28
|
+
</thead>
|
29
|
+
<tbody>
|
30
|
+
<% autos.each_with_index { |row,id|
|
31
|
+
t = Time.now.to_i
|
32
|
+
active = !auto ? false : row.id == auto.id
|
33
|
+
param_auto = active ? "" : row.id
|
34
|
+
param_hash = {"auto" => param_auto, "run" => "", "task" => "", "exe" => ""}
|
35
|
+
num_runs = row.get_num_runs
|
36
|
+
globally_executed_tasks = row.get_globally_executed_tasks
|
37
|
+
prop_changes = row.num_global_state_transitions
|
38
|
+
%>
|
39
|
+
<tr class="<%= active ? "active" : "" %>">
|
40
|
+
<td><%= id+1 %></td>
|
41
|
+
<td><a href="/scripts/<%= row.id %>/details"><%= row.uuid %></a></td>
|
42
|
+
<td><%= row.name %></td>
|
43
|
+
<td><%= row.language %></td>
|
44
|
+
<td><%= globally_executed_tasks.size %></td>
|
45
|
+
<td><%= row.automation_attributes.size %></td>
|
46
|
+
<td><%= num_runs %></td>
|
47
|
+
<td><%= link_to "#{prop_changes}", "/execs/#{row.id}/tasks" %></td>
|
48
|
+
<td><%= link_to 'details', "/analysis/index/#{row.id}" %></td>
|
49
|
+
<td><%= link_to 'convergence', "/analysis/conv/auto/#{row.id}" %></td>
|
50
|
+
<td><%= link_to 'idempotence', "/analysis/idem/auto/#{row.id}" %></td>
|
51
|
+
</tr>
|
52
|
+
<% } %>
|
53
|
+
</tbody>
|
54
|
+
</table>
|
55
|
+
|
56
|
+
<% if !auto %>
|
57
|
+
Please select an <b>automation</b> or a specific <b>test suite</b> to perform idempotence analysis.
|
58
|
+
<% else %>
|
59
|
+
<h2>Automation Details</h2>
|
60
|
+
<p>Selected Automation UUID: <%= auto.uuid %></p>
|
61
|
+
<h3>Automation Tasks</h3>
|
62
|
+
<% if suite %>
|
63
|
+
<br/>Test Suite UUID: <%= suite.uuid %>
|
64
|
+
<% end %>
|
65
|
+
|
66
|
+
<table class="tablesorter" id="tablesorter">
|
67
|
+
<thead>
|
68
|
+
<tr><th>#</th><th>ID</th>
|
69
|
+
<th>Resource</th><th>Action</th>
|
70
|
+
<!--<th>File</th><th>Line</th>-->
|
71
|
+
<th>Success (%)</th>
|
72
|
+
<th>State Changes</th>
|
73
|
+
<th colspan="2">Actions</th></tr>
|
74
|
+
</thead>
|
75
|
+
<tbody>
|
76
|
+
<% count = 0
|
77
|
+
tasks.each_with_index { |row,id|
|
78
|
+
if show_toaster_tasks || !row.toaster_testing_task?
|
79
|
+
active = false
|
80
|
+
param_task = active ? "" : row.id
|
81
|
+
clazz = active ? "active " : ""
|
82
|
+
clazz.strip!
|
83
|
+
#prop_changes = row.global_state_prop_changes
|
84
|
+
prop_changes = row.global_state_transitions
|
85
|
+
%>
|
86
|
+
<tr<%= clazz != '' ? " class=\"#{clazz}\"" : "" %>>
|
87
|
+
<td><%= count += 1 %></td>
|
88
|
+
<td><%= row.uuid %></td>
|
89
|
+
<td><%= row.resource %></td>
|
90
|
+
<td><%= row.action %></td>
|
91
|
+
<!--<td><%= row.sourcefile %></td>
|
92
|
+
<td><%= row.sourceline %></td>-->
|
93
|
+
<td><%= format_float(row.global_success_percentage) %> %</td>
|
94
|
+
<td><%= prop_changes.size %></td>
|
95
|
+
<td><a href="/analysis/conv/task/<%= row.id %>">convergence</a></td>
|
96
|
+
<td><a href="/analysis/idem/task/<%= row.id %>">idempotence</a></td>
|
97
|
+
</tr>
|
98
|
+
<% end
|
99
|
+
} %>
|
100
|
+
</tbody>
|
101
|
+
</table>
|
102
|
+
|
103
|
+
<h3>All Affected State Properties</h3>
|
104
|
+
<table class="tablesorter">
|
105
|
+
<thead>
|
106
|
+
<tr><th>Property Name</th></tr>
|
107
|
+
</thead>
|
108
|
+
<% begin
|
109
|
+
auto.all_affected_property_names.each do |p| %>
|
110
|
+
<tr><td><%= p %></td></tr>
|
111
|
+
<% end
|
112
|
+
rescue => ex %>
|
113
|
+
<tr><td>[Error: <%= ex %> <%= ex.backtrace %>]</td></tr>
|
114
|
+
<% end %>
|
115
|
+
</table>
|
116
|
+
|
117
|
+
<% end %>
|
@@ -10,7 +10,6 @@ begin
|
|
10
10
|
auto = cur_auto()
|
11
11
|
runs = cur_runs()
|
12
12
|
run = cur_run()
|
13
|
-
puts "run #{run}"
|
14
13
|
|
15
14
|
end
|
16
15
|
|
@@ -18,24 +17,26 @@ end
|
|
18
17
|
<div>
|
19
18
|
<h1>Automation Runs</h1>
|
20
19
|
|
20
|
+
<p>
|
21
21
|
<ul><li>
|
22
|
-
<% if auto %>
|
22
|
+
<% if auto && auto.id %>
|
23
23
|
Displaying runs of automation <b>'<%= auto.name %>'</b>.
|
24
24
|
(<a href="/execs">show all</a>)
|
25
25
|
<% else %>
|
26
26
|
Displaying runs of all automations. Use the 'Automation' section to filter the list for a specific automation.
|
27
27
|
<% end %>
|
28
28
|
</li></ul>
|
29
|
+
</p>
|
29
30
|
|
30
31
|
<table class="tablesorter">
|
31
32
|
<thead>
|
32
33
|
<tr><th>#</th><th>UUID</th><th>Automation</th><th>Start Time</th><!-- <th>Machine ID</th> -->
|
33
|
-
<th>Task Executions</th><th>Duration</th><th>Success</th><th colspan="
|
34
|
+
<th>Task Executions</th><th>Duration</th><th>Success</th><th colspan="3">Actions</th></tr>
|
34
35
|
</thead>
|
35
36
|
<tbody>
|
36
37
|
<% runs.each_with_index { |row,id|
|
37
38
|
clazz = row.success ? 'success' : 'error'
|
38
|
-
active = row.id
|
39
|
+
active = run && row.id == run.id
|
39
40
|
clazz += ' active' if active
|
40
41
|
param_run = active ? "" : row.id
|
41
42
|
auto_name = row.automation ? row.automation.name : "n/a"
|
@@ -52,6 +53,11 @@ param_hash = {"run" => param_run}.merge(row.automation ? {'auto' => row.automati
|
|
52
53
|
<td class="center"><%= row.success ? "true" : "false" %></td>
|
53
54
|
<td><% if row.automation %><a href="/execs/<%= row.automation.id %>/<%= row.id %>">details</a><% end %></nobr></td>
|
54
55
|
<td><% if row.automation %><a href="/execs/<%= row.automation.id %>/<%= row.id %>/tasks">executed tasks</a><% end %></nobr></td>
|
56
|
+
<td><%= if row.automation
|
57
|
+
link_to 'delete', "/execs/#{row.automation.id}/#{row.id}",
|
58
|
+
:data => { :confirm => 'Confirm: Delete this automation run, including all task executions?'
|
59
|
+
}, :method => :delete
|
60
|
+
end %></td>
|
55
61
|
</tr>
|
56
62
|
<% } %>
|
57
63
|
</tbody>
|
@@ -8,16 +8,16 @@ run = cur_run()
|
|
8
8
|
show_toaster_tasks = true # TODO
|
9
9
|
|
10
10
|
%>
|
11
|
-
<
|
11
|
+
<h1>Task Executions</h1>
|
12
12
|
<% if task
|
13
13
|
global_executions = task.global_executions
|
14
14
|
%>
|
15
|
-
<
|
15
|
+
<h2>Details of Task '<%= task.name %>'</h2>
|
16
16
|
<table>
|
17
17
|
<tr><td>Number of executions:</td><td><%= global_executions.size %></td></tr>
|
18
18
|
</table>
|
19
19
|
|
20
|
-
<
|
20
|
+
<h3>Executions</h3>
|
21
21
|
<table class="properties tablesorter">
|
22
22
|
<thead>
|
23
23
|
<tr><th>#</th><th>Automation Run</th><th>Start Time</th><th>Duration</th><th>Success</th><th>Property<br/>Changes</th><th>Actions</th></tr>
|
@@ -30,25 +30,30 @@ global_executions = task.global_executions
|
|
30
30
|
%>
|
31
31
|
<tr class="<%= exe.success ? 'success' : 'error' %><%= active ? ' active' : '' %>">
|
32
32
|
<td><%= index+1 %></td>
|
33
|
-
<td
|
33
|
+
<td><% if run.automation %>
|
34
|
+
<a href="/execs/<%= run.automation.id %>/<%= run.id %>"><%= run.uuid %></a>
|
35
|
+
<% end %></td>
|
34
36
|
<td><%= format_time(exe.start_time) %></td>
|
35
37
|
<td><%= to_minutes(exe.end_time.to_i - exe.start_time) %></td>
|
36
38
|
<td><%= exe.success %></td>
|
37
39
|
<td><%= exe.state_changes.size %></td>
|
38
|
-
<td
|
40
|
+
<td><% if run.automation %>
|
41
|
+
<a href="/execs/<%= run.automation.id %>/tasks/<%= task.id %>/<%= exe.id %>">details</a>
|
42
|
+
<% end %></td>
|
39
43
|
</tr>
|
40
44
|
<% end %>
|
41
45
|
</tbody>
|
42
46
|
</table>
|
43
47
|
|
44
48
|
<% if exec %>
|
45
|
-
<
|
49
|
+
<h3>Execution Details</h3>
|
50
|
+
<p>Task execution UUID: <%= exec.uuid %></p>
|
46
51
|
<% if exec.output && exec.output.strip != "" %>
|
47
|
-
<
|
52
|
+
<h4>Script Output:</h4>
|
48
53
|
<pre style="overflow: auto; height: 100px"><%= exec.output %></pre>
|
49
54
|
<% end %>
|
50
55
|
<% if !exec.success && exec.error_details %>
|
51
|
-
<
|
56
|
+
<h4>Error Details:</h4>
|
52
57
|
<pre style="overflow: auto; height: 250px"><%= exec.error_details %></pre>
|
53
58
|
<% end %>
|
54
59
|
<script type="text/javascript" src="/assets/jquery.jstree.js"></script>
|
@@ -57,11 +62,10 @@ global_executions = task.global_executions
|
|
57
62
|
<script type="text/javascript" src="/assets/jstree.util.js"></script>
|
58
63
|
<% if exec.state_before %>
|
59
64
|
<div class="stateFrame">
|
60
|
-
<
|
65
|
+
<h4>Pre-State:</h4>
|
61
66
|
<div id="preState"></div>
|
62
67
|
</div>
|
63
68
|
<script type="text/javascript">
|
64
|
-
<%= puts exec.state_before.to_s %>
|
65
69
|
var jsonData = <%= exec.state_before.to_json.html_safe %>
|
66
70
|
initTree("preState", jsonData);
|
67
71
|
</script>
|
@@ -69,7 +73,7 @@ global_executions = task.global_executions
|
|
69
73
|
<div style="width: 5%; float: left;"> </div>
|
70
74
|
<% if exec.state_after %>
|
71
75
|
<div class="stateFrame">
|
72
|
-
<
|
76
|
+
<h4>Post-State:</h4>
|
73
77
|
<div id="postState"></div>
|
74
78
|
</div>
|
75
79
|
<script type="text/javascript">
|
@@ -80,7 +84,7 @@ global_executions = task.global_executions
|
|
80
84
|
<div style="clear: both"></div>
|
81
85
|
<% end %>
|
82
86
|
|
83
|
-
<
|
87
|
+
<h3>State changes</h3>
|
84
88
|
<table id="properties" class="tablesorter">
|
85
89
|
<thead>
|
86
90
|
<tr><th>Action</th><th>Property</th><th colspan="3">Value(s)</th><th>Occurrences</th><th>Occurrences (%)</th></tr>
|
@@ -105,10 +109,10 @@ global_executions = task.global_executions
|
|
105
109
|
</table>
|
106
110
|
|
107
111
|
<% elsif run %>
|
108
|
-
|
112
|
+
<p>Automation run UUID: <%= run.uuid %></p>
|
109
113
|
<table class="tablesorter" id="tablesorter">
|
110
114
|
<thead>
|
111
|
-
<tr><th>#</th><th>ID</th>
|
115
|
+
<tr><th>#</th><th>Task ID</th>
|
112
116
|
<th>Start Time</th><th>Duration</th>
|
113
117
|
<th>Resource</th><th>Action</th><th>File</th><th>Line</th>
|
114
118
|
<th>Success</th>
|
@@ -119,7 +123,7 @@ global_executions = task.global_executions
|
|
119
123
|
run.task_executions.each_with_index { |exec,id|
|
120
124
|
row = exec.task
|
121
125
|
if show_toaster_tasks || !row.toaster_testing_task?
|
122
|
-
active = row.id
|
126
|
+
active = task && row.id == task.id
|
123
127
|
param_task = active ? "" : row.id
|
124
128
|
clazz = active ? "active " : ""
|
125
129
|
if !run && detailed
|
@@ -140,7 +144,7 @@ global_executions = task.global_executions
|
|
140
144
|
<td><%= row.sourcefile %></td>
|
141
145
|
<td><%= row.sourceline %></td>
|
142
146
|
<td><%= exec.success %></td>
|
143
|
-
<td><a href="/execs/<%= run.automation.id %>/tasks/<%= exec.id %>/<%=
|
147
|
+
<td><a href="/execs/<%= run.automation.id %>/tasks/<%= exec.task.id %>/<%= exec.id %>">details</a></td>
|
144
148
|
</tr>
|
145
149
|
<% end
|
146
150
|
} %>
|
@@ -19,9 +19,6 @@
|
|
19
19
|
session['db.host'] = Toaster::Config.get("db.host") if "#{session['db.host']}".empty?
|
20
20
|
session['db.port'] = Toaster::Config.get("db.port") if "#{session['db.port']}".empty?
|
21
21
|
%>
|
22
|
-
<p class="notice"><%= notice %></p>
|
23
|
-
<p class="alert"><%= alert %></p>
|
24
|
-
|
25
22
|
<div class="container">
|
26
23
|
<div class="header">
|
27
24
|
<h1>ToASTER<sup>[beta]</sup></h1>
|
@@ -66,10 +63,10 @@
|
|
66
63
|
</div>
|
67
64
|
</a>
|
68
65
|
<ul><li><a href="/execs">Automation Runs</a></li>
|
69
|
-
<li><a href="/execs/
|
66
|
+
<li><a href="/execs/tasks">Task Executions</a></li></ul>
|
70
67
|
</li>
|
71
68
|
<li class="<%= request.path.match(/^\/analysis/) ? "active" : "inactive" %>">
|
72
|
-
<a href="/analysis/
|
69
|
+
<a href="/analysis/index">
|
73
70
|
<span class="ca-icon">L</span>
|
74
71
|
<div class="ca-content">
|
75
72
|
<h2 class="ca-main">Analysis</h2>
|
@@ -90,24 +87,40 @@
|
|
90
87
|
<ul><li><a href="/util/chef">Chef</a></li></ul>
|
91
88
|
</li>
|
92
89
|
<li class="<%= request.path.match(/^\/settings/) ? "active" : "inactive" %>">
|
93
|
-
<a href="/settings/
|
90
|
+
<a href="/settings/config">
|
94
91
|
<span class="ca-icon">K</span>
|
95
92
|
<div class="ca-content">
|
96
93
|
<h2 class="ca-main">Settings</h2>
|
97
94
|
<h3 class="ca-sub">Adjust configurations</h3>
|
98
95
|
</div>
|
99
96
|
</a>
|
100
|
-
<ul><li><a href="/settings/
|
97
|
+
<ul><li><a href="/settings/config">Configuration</a></li>
|
101
98
|
<li><a href="/settings/containers">Containers</a></li></ul>
|
102
99
|
</li>
|
103
100
|
</ul>
|
104
101
|
|
105
102
|
<div class="pages">
|
106
|
-
<div id="quickstart" class="panel">
|
107
103
|
<div class="content">
|
104
|
+
<div class="messages">
|
105
|
+
<% flash.each do |name, msg|
|
106
|
+
if msg.kind_of?(Array) && msg.size == 1
|
107
|
+
msg = msg[0]
|
108
|
+
end %>
|
109
|
+
<div class="<%= name %>">
|
110
|
+
<% if msg.kind_of?(Array) %>
|
111
|
+
<ul>
|
112
|
+
<% msg.each do |msg1| %>
|
113
|
+
<li><%= msg1 %></li>
|
114
|
+
<% end %>
|
115
|
+
</ul>
|
116
|
+
<% else %>
|
117
|
+
<%= msg %>
|
118
|
+
<% end %>
|
119
|
+
</div>
|
120
|
+
<% end %>
|
121
|
+
</div>
|
108
122
|
<%= yield %>
|
109
123
|
</div>
|
110
|
-
</div>
|
111
124
|
</div>
|
112
125
|
</div>
|
113
126
|
</body>
|