cloud-toaster 1.1.5 → 1.1.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -20,7 +20,7 @@ module Toaster
|
|
20
20
|
belongs_to :automation
|
21
21
|
belongs_to :user
|
22
22
|
belongs_to :test_coverage_goal
|
23
|
-
has_many :test_cases,
|
23
|
+
has_many :test_cases, :autosave => true, :dependent => :destroy
|
24
24
|
serialize :parameter_test_values, JSON
|
25
25
|
|
26
26
|
def initialize(attr_hash)
|
data/lib/toaster/test_manager.rb
CHANGED
@@ -106,6 +106,7 @@ module Toaster
|
|
106
106
|
# get additional_state_configs from automation
|
107
107
|
automation = AutomationRun.get_current().automation
|
108
108
|
add_automation_specific_state_config(@state_change_config)
|
109
|
+
task.automation = automation if !task.automation
|
109
110
|
|
110
111
|
# determine which parameters the task code accesses:
|
111
112
|
task.task_parameters.concat(ResourceInspector.get_accessed_parameters(task))
|
@@ -248,15 +249,8 @@ module Toaster
|
|
248
249
|
if !test_suite.kind_of?(TestSuite)
|
249
250
|
test_suite = TestSuite.find({"uuid" => test_suite})
|
250
251
|
end
|
251
|
-
|
252
|
-
|
253
|
-
runner.start_test_suite(blocking)
|
254
|
-
runner.stop
|
255
|
-
else
|
256
|
-
runner = TestRunner.new(test_suite, nil, true)
|
257
|
-
runner.start_test_suite(blocking)
|
258
|
-
runner.start_worker_threads()
|
259
|
-
end
|
252
|
+
tests_to_run = test_suite.test_cases.select { |tc| !tc.executed? }
|
253
|
+
TestRunner.instance.execute_tests(tests_to_run, blocking)
|
260
254
|
end
|
261
255
|
|
262
256
|
private
|
@@ -137,9 +137,5 @@ if ARGV.include?("do_start_service")
|
|
137
137
|
puts "Starting service on port #{$service_port}"
|
138
138
|
Toaster::Config.init_db_connection()
|
139
139
|
server = ToasterAppService.new($service_port, "0.0.0.0")
|
140
|
-
|
141
|
-
# client = ToasterApp.new()
|
142
|
-
# client.runtest("2285f8539f6c48873")
|
143
|
-
# client.runtests("88056bebc7e384cac")
|
144
140
|
server.start
|
145
141
|
end
|
data/lib/toaster/util/config.rb
CHANGED
@@ -44,6 +44,9 @@ module Toaster
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def self.init_db_connection(config=nil)
|
47
|
+
if $db_connection_initialized
|
48
|
+
return
|
49
|
+
end
|
47
50
|
require "toaster/util/util"
|
48
51
|
if !config || !config["mysql"]
|
49
52
|
config = {
|
@@ -59,8 +62,10 @@ module Toaster
|
|
59
62
|
:host => "#{config["mysql"]["host"]}".empty? ? get("db.host") : config["mysql"]["host"],
|
60
63
|
:database => "#{config["mysql"]["database"]}".empty? ? get("db.database") : config["mysql"]["database"],
|
61
64
|
:username => "#{config["mysql"]["username"]}".empty? ? get("db.username") : config["mysql"]["username"],
|
62
|
-
:password => "#{config["mysql"]["password"]}".empty? ? get("db.password") : config["mysql"]["password"]
|
65
|
+
:password => "#{config["mysql"]["password"]}".empty? ? get("db.password") : config["mysql"]["password"],
|
66
|
+
:pool => 50 # connection pool size limit (default is 5 which is not sufficient)
|
63
67
|
)
|
68
|
+
$db_connection_initialized = true
|
64
69
|
else
|
65
70
|
puts "WARN: Incorrect database connection configuration"
|
66
71
|
end
|
data/lib/toaster/util/lxc.rb
CHANGED
@@ -139,7 +139,7 @@ module Toaster
|
|
139
139
|
node_attributes["toaster"][key] = value
|
140
140
|
end
|
141
141
|
end
|
142
|
-
puts "DEBUG: Chef automation #{chef_node}, node attributes: #{node_attributes
|
142
|
+
puts "DEBUG: Chef automation #{chef_node}, node attributes: #{MarkupUtil.to_json(node_attributes)}"
|
143
143
|
|
144
144
|
run_chef(lxc, chef_node, node_attributes)
|
145
145
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
function initTree(containerID, jsonData) {
|
2
2
|
$("#" + containerID).jstree({
|
3
3
|
"plugins" : [
|
4
|
-
"themes",
|
4
|
+
//"themes",
|
5
|
+
"json_data","ui","crrm","cookies","dnd","search","types","hotkeys","contextmenu"
|
5
6
|
],
|
6
7
|
"json_data" : {
|
7
8
|
"data" : prepareTreeNode(jsonData)
|
@@ -18,7 +18,18 @@
|
|
18
18
|
font-weight: 400;
|
19
19
|
src: local('Dosis Regular'), local('Dosis-Regular'), url("/assets/font.woff") format('woff');
|
20
20
|
}
|
21
|
-
|
21
|
+
div.messages div {
|
22
|
+
width: 90%; margin: auto;
|
23
|
+
padding: 7px;
|
24
|
+
}
|
25
|
+
div.messages .info, div.messages .notice {
|
26
|
+
border: 1px solid #F7DF8D;
|
27
|
+
background: #FAEDC1;
|
28
|
+
}
|
29
|
+
div.messages .warn, div.messages .alert, div.messages .error {
|
30
|
+
border: 1px solid #FBA3A3;
|
31
|
+
background: #FFD4D4;
|
32
|
+
}
|
22
33
|
.content table {
|
23
34
|
border: 1px solid #bbc;
|
24
35
|
}
|
@@ -46,4 +57,13 @@
|
|
46
57
|
.content .unremarkable, .content .unremarkable td {
|
47
58
|
opacity: 0.7;
|
48
59
|
-moz-opacity: 0.7;
|
60
|
+
}
|
61
|
+
tr.active td {
|
62
|
+
font-weight: bold;
|
63
|
+
}
|
64
|
+
.content pre {
|
65
|
+
border: 1px solid #dddddd;
|
66
|
+
background: #f1f1f1;
|
67
|
+
font-size: 12px;
|
68
|
+
margin: 10px;
|
49
69
|
}
|
@@ -1,7 +1,19 @@
|
|
1
1
|
class AnalysisController < ApplicationController
|
2
|
+
|
3
|
+
skip_before_action :verify_authenticity_token
|
4
|
+
|
2
5
|
def idempotence
|
3
6
|
end
|
4
7
|
|
5
8
|
def convergence
|
6
9
|
end
|
10
|
+
|
11
|
+
def cur_auto()
|
12
|
+
ScriptsController.cur_auto(session, params)
|
13
|
+
end
|
14
|
+
def cur_suite
|
15
|
+
TestController.cur_suite(session, params)
|
16
|
+
end
|
17
|
+
|
18
|
+
helper_method :cur_auto, :cur_suite
|
7
19
|
end
|
@@ -5,10 +5,18 @@ class ApplicationController < BaseController
|
|
5
5
|
# For APIs, you may want to use :null_session instead.
|
6
6
|
protect_from_forgery :with => :exception
|
7
7
|
|
8
|
-
# use authentication based on "devise"
|
9
|
-
before_filter :authenticate_user!
|
10
|
-
|
11
8
|
# global requires
|
12
9
|
$LOAD_PATH << File.join(File.dirname(__FILE__), "../../../../../lib")
|
13
10
|
|
11
|
+
# use authentication based on "devise"
|
12
|
+
#before_filter :authenticate_user!
|
13
|
+
include Devise::Controllers::Helpers
|
14
|
+
before_filter do
|
15
|
+
fail "bad ancestor" unless self.kind_of?(Devise::Controllers::Helpers)
|
16
|
+
fail "no mapping" unless Devise.class_variable_get(:@@mappings)[:user]
|
17
|
+
authenticate_user!
|
18
|
+
end
|
19
|
+
|
20
|
+
#acts_as_token_authentication_handler_for User, :fallback_to_devise => false
|
21
|
+
|
14
22
|
end
|
@@ -10,9 +10,17 @@ class ExecsController < ApplicationController
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def list
|
13
|
-
|
14
13
|
end
|
15
14
|
|
15
|
+
def delete_run
|
16
|
+
run = cur_run
|
17
|
+
if run
|
18
|
+
run.destroy
|
19
|
+
msg = "Successfully deleted automation run with UUID '#{run.uuid}'"
|
20
|
+
flash[:notice] ? (flash[:notice] << msg) : (flash[:notice] = [msg])
|
21
|
+
end
|
22
|
+
redirect_to "/execs"
|
23
|
+
end
|
16
24
|
|
17
25
|
def cur_auto()
|
18
26
|
ScriptsController.cur_auto(session, params)
|
@@ -26,9 +34,9 @@ class ExecsController < ApplicationController
|
|
26
34
|
end
|
27
35
|
end
|
28
36
|
|
29
|
-
|
30
|
-
|
31
|
-
|
37
|
+
def cur_run()
|
38
|
+
ExecsController.cur_run(session, params)
|
39
|
+
end
|
32
40
|
def self.cur_run(session, params)
|
33
41
|
a = ScriptsController.cur_auto(session, params)
|
34
42
|
return nil if !a
|
@@ -1,6 +1,7 @@
|
|
1
1
|
class ScriptsController < ApplicationController
|
2
2
|
|
3
|
-
|
3
|
+
require "toaster/model/automation"
|
4
|
+
require "toaster/model/key_value_pair"
|
4
5
|
require "toaster/model/automation_attribute"
|
5
6
|
require "toaster/chef/chef_util"
|
6
7
|
|
@@ -14,9 +15,11 @@ class ScriptsController < ApplicationController
|
|
14
15
|
if request.post? || request.patch?
|
15
16
|
if params[:add_param]
|
16
17
|
auto = cur_auto
|
18
|
+
set_auto_values(auto)
|
17
19
|
auto.automation_attributes << Toaster::AutomationAttribute.new(
|
18
20
|
:key => "", :value => "")
|
19
21
|
elsif params[:del_param]
|
22
|
+
set_auto_values(auto)
|
20
23
|
params[:auto][:attr].each do |index,attr|
|
21
24
|
if params[:del_param][index]
|
22
25
|
to_delete = cur_auto.automation_attributes[index.to_i - 1]
|
@@ -26,9 +29,11 @@ class ScriptsController < ApplicationController
|
|
26
29
|
end
|
27
30
|
elsif params[:add_ignoreprop]
|
28
31
|
auto = cur_auto
|
32
|
+
set_auto_values(auto)
|
29
33
|
auto.ignore_properties << Toaster::IgnoreProperty.new(
|
30
34
|
:key => "", :value => "")
|
31
35
|
elsif params[:del_ignoreprop]
|
36
|
+
set_auto_values(auto)
|
32
37
|
params[:auto][:ignoreprop].each do |index,attr|
|
33
38
|
if params[:del_ignoreprop][index]
|
34
39
|
to_delete = cur_auto.ignore_properties[index.to_i - 1]
|
@@ -38,13 +43,16 @@ class ScriptsController < ApplicationController
|
|
38
43
|
end
|
39
44
|
elsif params[:add_additionalprop]
|
40
45
|
auto = cur_auto
|
46
|
+
set_auto_values(auto)
|
41
47
|
auto.additional_properties << Toaster::AdditionalProperty.new(
|
42
48
|
:key => "", :value => "")
|
43
49
|
elsif params[:del_additionalprop]
|
50
|
+
auto = cur_auto
|
51
|
+
set_auto_values(auto)
|
44
52
|
params[:auto][:additionalprop].each do |index,attr|
|
45
53
|
if params[:del_additionalprop][index]
|
46
|
-
to_delete =
|
47
|
-
|
54
|
+
to_delete = auto.additional_properties[index.to_i - 1]
|
55
|
+
auto.additional_properties.destroy(to_delete) if to_delete
|
48
56
|
break
|
49
57
|
end
|
50
58
|
end
|
@@ -57,27 +65,7 @@ class ScriptsController < ApplicationController
|
|
57
65
|
else
|
58
66
|
auto = cur_auto
|
59
67
|
end
|
60
|
-
auto
|
61
|
-
auto.language = params[:auto][:language]
|
62
|
-
auto.visibility = params[:auto][:visibility]
|
63
|
-
auto.user = current_user
|
64
|
-
auto.script = params[:auto][:script]
|
65
|
-
if params[:auto][:attr]
|
66
|
-
params[:auto][:attr].each do |index,attr|
|
67
|
-
auto.automation_attributes[index.to_i - 1].key = attr["key"]
|
68
|
-
auto.automation_attributes[index.to_i - 1].value = attr["value"]
|
69
|
-
end
|
70
|
-
end
|
71
|
-
if params[:auto][:ignoreprop]
|
72
|
-
params[:auto][:ignoreprop].each do |index,prop|
|
73
|
-
auto.ignore_properties[index.to_i - 1].key = prop["key"]
|
74
|
-
end
|
75
|
-
end
|
76
|
-
if params[:auto][:additionalprop]
|
77
|
-
params[:auto][:additionalprop].each do |index,prop|
|
78
|
-
auto.additional_properties[index.to_i - 1].key = prop["key"]
|
79
|
-
end
|
80
|
-
end
|
68
|
+
set_auto_values(auto)
|
81
69
|
auto.save
|
82
70
|
redirect_to scripts_url()
|
83
71
|
end
|
@@ -86,11 +74,35 @@ class ScriptsController < ApplicationController
|
|
86
74
|
end
|
87
75
|
end
|
88
76
|
|
77
|
+
def set_auto_values(auto)
|
78
|
+
auto.name = params[:auto][:name]
|
79
|
+
auto.language = params[:auto][:language]
|
80
|
+
auto.visibility = params[:auto][:visibility]
|
81
|
+
auto.user = current_user
|
82
|
+
auto.script = params[:auto][:script]
|
83
|
+
if params[:auto][:attr]
|
84
|
+
params[:auto][:attr].each do |index,attr|
|
85
|
+
auto.automation_attributes[index.to_i - 1].key = attr["key"]
|
86
|
+
auto.automation_attributes[index.to_i - 1].value = attr["value"]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
if params[:auto][:ignoreprop]
|
90
|
+
params[:auto][:ignoreprop].each do |index,prop|
|
91
|
+
auto.ignore_properties[index.to_i - 1].key = prop["key"]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
if params[:auto][:additionalprop]
|
95
|
+
params[:auto][:additionalprop].each do |index,prop|
|
96
|
+
auto.additional_properties[index.to_i - 1].key = prop["key"]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
89
101
|
def delete
|
90
102
|
id = params[:auto_id]
|
91
103
|
a = Toaster::Automation.find(id)
|
92
104
|
if a
|
93
|
-
a.
|
105
|
+
a.destroy
|
94
106
|
end
|
95
107
|
redirect_to scripts_url()
|
96
108
|
end
|
@@ -107,44 +119,71 @@ class ScriptsController < ApplicationController
|
|
107
119
|
:user => current_user,
|
108
120
|
:script => script_file
|
109
121
|
)
|
110
|
-
#
|
122
|
+
# get recipes
|
111
123
|
params[:recipes].split(/[\s,;]+/).each do |rec|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
124
|
+
begin
|
125
|
+
recipe_info = ChefUtil.parse_resources(
|
126
|
+
params[:cookbook], rec, params[:cookbook_version])[params[:cookbook]][rec]
|
127
|
+
# get recipe parameters
|
128
|
+
insp = ChefNodeInspector.new { |level, msg|
|
129
|
+
if flash[:notice]
|
130
|
+
flash[:notice].concat(msg)
|
131
|
+
else
|
132
|
+
flash[:notice] = [msg]
|
133
|
+
end
|
134
|
+
}
|
135
|
+
attr_hash = insp.get_defaults(params[:cookbook], rec)
|
136
|
+
a.automation_attributes.concat(
|
137
|
+
KeyValuePair.flat_attributes_from_hash(
|
138
|
+
attr_hash, AutomationAttribute))
|
139
|
+
|
140
|
+
recipe_info["resources"].each do |line,code|
|
141
|
+
action = "__action__"
|
142
|
+
resource = "__resource__"
|
143
|
+
if recipe_info["resource_objs"][line]
|
144
|
+
action = recipe_info["resource_objs"][line].action
|
145
|
+
action = action.join(" , ") if action.kind_of?(Array)
|
146
|
+
resource = recipe_info["resource_objs"][line].to_s
|
147
|
+
end
|
148
|
+
task = Task.new(
|
149
|
+
:automation => a,
|
150
|
+
:sourceline => line,
|
151
|
+
:sourcecode => code,
|
152
|
+
:sourcefile => recipe_info["file"],
|
153
|
+
:resource => resource,
|
154
|
+
:action => action
|
155
|
+
)
|
156
|
+
# get task parameters
|
157
|
+
task.task_parameters = ResourceInspector.get_accessed_parameters(task)
|
158
|
+
# save
|
159
|
+
task.save
|
160
|
+
a.tasks << task
|
161
|
+
end
|
162
|
+
# save
|
163
|
+
a.save
|
164
|
+
rescue Object => ex
|
165
|
+
msg = "WARN: Unable to import Chef cookbook '#{params[:cookbook]}', " +
|
166
|
+
"version '#{params[:cookbook_version]}', recipe '#{rec}': #{ex}"
|
167
|
+
flash[:alert] = msg
|
168
|
+
puts msg
|
169
|
+
puts ex.backtrace.join("\n")
|
170
|
+
end
|
171
|
+
end
|
172
|
+
redirect_to scripts_url()
|
136
173
|
end
|
137
174
|
end
|
138
175
|
|
139
176
|
def cur_auto_reset()
|
140
|
-
|
177
|
+
session[:auto_cur] = nil
|
141
178
|
end
|
142
179
|
|
143
180
|
def cur_auto()
|
144
181
|
ScriptsController.cur_auto(session, params)
|
145
182
|
end
|
146
183
|
def self.cur_auto(session, params)
|
147
|
-
if !session[:auto_cur] ||
|
184
|
+
if !session[:auto_cur] || (
|
185
|
+
session[:auto_cur].id && "#{session[:auto_cur].id}" != params[:auto_id])
|
186
|
+
|
148
187
|
session[:auto_cur] = nil
|
149
188
|
if params[:auto_id] == "0"
|
150
189
|
session[:auto_cur] = Toaster::Automation.new(
|
@@ -57,8 +57,9 @@ class TestController < ApplicationController
|
|
57
57
|
test_case.start_time = nil
|
58
58
|
test_case.end_time = nil
|
59
59
|
if test_case.automation_run
|
60
|
-
test_case.automation_run.
|
60
|
+
test_case.automation_run.destroy
|
61
61
|
end
|
62
|
+
test_case.executing_host = nil
|
62
63
|
test_case.save
|
63
64
|
redirect_to "/test/suites/#{test_case.test_suite.id}"
|
64
65
|
else
|
@@ -79,16 +80,15 @@ class TestController < ApplicationController
|
|
79
80
|
test_suite = cur_suite
|
80
81
|
client = service_client
|
81
82
|
session[:suite_cur] = nil
|
82
|
-
client.runtests(test_suite.uuid)
|
83
|
+
session[:exec_output] = client.runtests(test_suite.uuid)
|
83
84
|
redirect_to "/test/suites/#{params["suite_id"]}"
|
84
85
|
end
|
85
86
|
|
86
87
|
def delete_suite
|
87
|
-
puts "deleting suite ..."
|
88
88
|
if cur_suite
|
89
89
|
puts "deleting suite #{cur_suite}"
|
90
90
|
session[:suite_cur] = nil
|
91
|
-
cur_suite.
|
91
|
+
cur_suite.destroy
|
92
92
|
redirect_to "/test/suites"
|
93
93
|
end
|
94
94
|
end
|