houcho 0.0.6 → 0.0.8
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 +4 -4
- data/.gitignore +1 -1
- data/Gemfile.lock +32 -0
- data/bin/houcho +3 -262
- data/houcho.gemspec +2 -1
- data/lib/houcho/attribute.rb +99 -0
- data/lib/houcho/ci.rb +18 -13
- data/lib/houcho/cli/attribute.rb +70 -0
- data/lib/houcho/cli/host.rb +46 -0
- data/lib/houcho/cli/outerrole.rb +53 -0
- data/lib/houcho/cli/role.rb +69 -0
- data/lib/houcho/cli/spec.rb +103 -0
- data/lib/houcho/cli.rb +52 -0
- data/lib/houcho/config.rb +28 -0
- data/lib/houcho/database.rb +99 -0
- data/lib/houcho/element.rb +79 -50
- data/lib/houcho/host.rb +30 -9
- data/lib/houcho/outerrole/cloudforecast.rb +94 -0
- data/{templates/role/cf_roles.yaml → lib/houcho/outerrole/yabitz.rb} +0 -0
- data/lib/houcho/outerrole.rb +52 -0
- data/lib/houcho/repository.rb +59 -0
- data/lib/houcho/role.rb +78 -91
- data/lib/houcho/spec/runner.rb +156 -85
- data/lib/houcho/spec.rb +72 -3
- data/lib/houcho/version.rb +1 -1
- data/lib/houcho.rb +10 -52
- data/spec/houcho_spec.rb +334 -91
- metadata +31 -22
- data/lib/houcho/cloudforecast/host.rb +0 -25
- data/lib/houcho/cloudforecast/role.rb +0 -25
- data/lib/houcho/cloudforecast.rb +0 -59
- data/lib/houcho/yamlhandle.rb +0 -31
- data/spec/spec_helper.rb +0 -15
- data/templates/conf/houcho.conf +0 -10
- data/templates/conf/kk.rb +0 -14
- data/templates/conf/rspec.conf +0 -1
- data/templates/master +0 -94
- data/templates/role/cloudforecast/.gitkeep +0 -0
- data/templates/role/cloudforecast.yaml +0 -0
- data/templates/role/hosts.yaml +0 -0
- data/templates/role/hosts_ignored.yaml +0 -0
- data/templates/role/roles.yaml +0 -0
- data/templates/role/specs.yaml +0 -0
- data/templates/spec/sample_spec.rb +0 -13
- data/templates/spec/spec_helper.rb +0 -29
data/lib/houcho.rb
CHANGED
@@ -1,55 +1,13 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require 'houcho/role'
|
12
|
-
require 'houcho/host'
|
13
|
-
require 'houcho/spec'
|
14
|
-
require 'houcho/spec/runner'
|
15
|
-
require 'houcho/cloudforecast'
|
16
|
-
require 'houcho/cloudforecast/role'
|
17
|
-
require 'houcho/cloudforecast/host'
|
18
|
-
require 'houcho/ci'
|
1
|
+
require "rubygems"
|
2
|
+
require "houcho/role"
|
3
|
+
require "houcho/element"
|
4
|
+
require "houcho/host"
|
5
|
+
require "houcho/spec"
|
6
|
+
require "houcho/spec/runner"
|
7
|
+
require "houcho/outerrole"
|
8
|
+
require "houcho/outerrole/cloudforecast"
|
9
|
+
require "houcho/repository"
|
10
|
+
require "houcho/attribute"
|
19
11
|
|
20
12
|
module Houcho
|
21
|
-
def init_repo
|
22
|
-
templates = File.expand_path("#{File.dirname(__FILE__)}/../templates")
|
23
|
-
|
24
|
-
%W{conf role spec}.each do |d|
|
25
|
-
FileUtils.cp_r("#{templates}/#{d}", d) if ! Dir.exist?(d)
|
26
|
-
end
|
27
|
-
|
28
|
-
File.symlink('./conf/rspec.conf', './.rspec') if ! File.exists? '.rspec'
|
29
|
-
|
30
|
-
`git init; git add .; git commit -a -m 'initialized houcho repository'` if ! Dir.exist?('.git')
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
def puts_details(e, indentsize = 0, cnt = 1)
|
35
|
-
case e
|
36
|
-
when Array
|
37
|
-
e.sort.each.with_index(1) do |v, i|
|
38
|
-
(indentsize-1).times {print ' '}
|
39
|
-
print i != e.size ? '├─ ' : '└─ '
|
40
|
-
puts v
|
41
|
-
end
|
42
|
-
puts ''
|
43
|
-
when Hash
|
44
|
-
e.each do |k,v|
|
45
|
-
if ! indentsize.zero?
|
46
|
-
(indentsize).times {print ' '}
|
47
|
-
end
|
48
|
-
k = k.color(0,255,0)
|
49
|
-
k = '[' + k.color(219,112,147) + ']' if indentsize.zero?
|
50
|
-
puts k
|
51
|
-
puts_details(v, indentsize+1, cnt+1)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
13
|
end
|
data/spec/houcho_spec.rb
CHANGED
@@ -1,164 +1,407 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
require "tmpdir"
|
4
|
+
spectmp = Dir.mktmpdir("houcho")
|
5
|
+
ENV["HOUCHO_ROOT"] = spectmp
|
6
|
+
|
7
|
+
require "rspec"
|
8
|
+
require "houcho"
|
9
|
+
require "fileutils"
|
5
10
|
|
6
11
|
describe Houcho do
|
7
12
|
before :all do
|
8
|
-
|
9
|
-
init_repo
|
10
|
-
Role.create(['studio3104', 'studio3105'])
|
11
|
-
Host.attach('hostA', 'studio3104')
|
12
|
-
|
13
|
-
File.write('spec/specA_spec.rb',' ')
|
14
|
-
Spec.attach('specA', 'studio3104')
|
13
|
+
Houcho::Repository.init
|
15
14
|
|
16
|
-
File.write(
|
15
|
+
File.write("#{Houcho::Config::CFYAMLDIR}/cf.yaml", <<YAML
|
17
16
|
--- #houcho
|
18
17
|
servers:
|
19
18
|
- label: rspec
|
20
19
|
config: studio3104
|
21
20
|
hosts:
|
22
|
-
- test1.studio3104.com
|
23
|
-
- test2.studio3104.com
|
24
|
-
|
21
|
+
- 192.168.1.11 test1.studio3104.com
|
22
|
+
- 192.168.1.12 test2.studio3104.com
|
23
|
+
YAML
|
25
24
|
)
|
26
|
-
|
27
|
-
|
25
|
+
|
26
|
+
File.write("#{Houcho::Config::SPECDIR}/specA_spec.rb"," ")
|
27
|
+
File.write("#{Houcho::Config::SPECDIR}/specB_spec.rb"," ")
|
28
|
+
File.write("#{Houcho::Config::SPECDIR}/specC_spec.rb"," ")
|
29
|
+
|
30
|
+
@role = Houcho::Role.new
|
31
|
+
@host = Houcho::Host.new
|
32
|
+
@spec = Houcho::Spec.new
|
33
|
+
@outerrole = Houcho::OuterRole.new
|
34
|
+
@specrunner = Houcho::Spec::Runner.new
|
35
|
+
|
36
|
+
@role.create(["studio3104", "studio3105"])
|
37
|
+
|
38
|
+
Houcho::OuterRole::CloudForecast.load
|
39
|
+
|
40
|
+
@host.attach("hostA", "studio3104")
|
41
|
+
@outerrole.attach("houcho::rspec::studio3104", "studio3104")
|
42
|
+
@spec.attach("specA", "studio3104")
|
28
43
|
end
|
29
44
|
|
30
45
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
46
|
+
after :all do
|
47
|
+
FileUtils.rm_rf(spectmp)
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
describe Houcho::Role do
|
52
|
+
context "create and delete a role" do
|
53
|
+
it { @role.create("www") }
|
54
|
+
it { @role.delete("www") }
|
55
|
+
|
56
|
+
it do
|
57
|
+
expect { @role.create("studio3104") }.to(
|
58
|
+
raise_error(Houcho::RoleExistenceException, "role already exist - studio3104")
|
59
|
+
)
|
60
|
+
end
|
61
|
+
|
62
|
+
it do
|
63
|
+
expect { @role.delete("web") }.to(
|
64
|
+
raise_error(Houcho::RoleExistenceException, "role does not exist - web")
|
65
|
+
)
|
66
|
+
end
|
37
67
|
end
|
38
68
|
|
39
|
-
|
40
|
-
|
41
|
-
it {
|
42
|
-
it {
|
43
|
-
|
69
|
+
|
70
|
+
context "create and delete two roles" do
|
71
|
+
it { @role.create(["studio3104::www", "studio3104::database"]) }
|
72
|
+
it { @role.delete(["studio3104::www", "studio3104::database"]) }
|
73
|
+
|
74
|
+
it do
|
75
|
+
expect { @role.create(["studio3104", "studio3105"]) }.to(
|
76
|
+
raise_error(Houcho::RoleExistenceException, "role already exist - studio3104")
|
77
|
+
)
|
78
|
+
end
|
79
|
+
|
80
|
+
it do
|
81
|
+
expect { @role.delete(["studio3104::www", "studio3104::database"]) }.to(
|
82
|
+
raise_error(Houcho::RoleExistenceException, "role does not exist - studio3104::www")
|
83
|
+
)
|
84
|
+
end
|
44
85
|
end
|
45
86
|
|
46
|
-
|
47
|
-
|
48
|
-
it {
|
49
|
-
|
50
|
-
it
|
87
|
+
|
88
|
+
context "rename a role" do
|
89
|
+
it { @role.rename("studio3105", "studio3106") }
|
90
|
+
|
91
|
+
it do
|
92
|
+
expect { @role.rename("invalid_role", "studio3106") }.to(
|
93
|
+
raise_error(Houcho::RoleExistenceException, "role does not exist - invalid_role")
|
94
|
+
)
|
95
|
+
end
|
96
|
+
|
97
|
+
it do
|
98
|
+
expect { @role.rename("studio3106", "studio3104") }.to(
|
99
|
+
raise_error(Houcho::RoleExistenceException, "role already exist - studio3104")
|
100
|
+
)
|
101
|
+
end
|
102
|
+
|
103
|
+
it { @role.rename("studio3106", "studio3105") }
|
51
104
|
end
|
52
105
|
|
53
|
-
|
54
|
-
|
106
|
+
|
107
|
+
context "get all roles" do
|
108
|
+
it { expect(@role.list).to eq(["studio3104", "studio3105"]) }
|
55
109
|
end
|
56
110
|
|
57
|
-
|
111
|
+
|
112
|
+
context "get details of a role" do
|
58
113
|
it do
|
59
|
-
expect(
|
114
|
+
expect(@role.details(["studio3104"])).to eq(
|
60
115
|
{
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
116
|
+
"studio3104" => {
|
117
|
+
"host" => [ "hostA" ],
|
118
|
+
"spec" => [ "specA" ],
|
119
|
+
"outer role" => {
|
120
|
+
"houcho::rspec::studio3104" => {
|
121
|
+
"host" => [ "test1.studio3104.com", "test2.studio3104.com" ]
|
122
|
+
}
|
123
|
+
}
|
65
124
|
}
|
66
125
|
}
|
67
126
|
)
|
68
127
|
end
|
69
128
|
end
|
70
129
|
|
71
|
-
it { expect(
|
72
|
-
it { expect(
|
73
|
-
it { expect(
|
130
|
+
it { expect(@role.id("studio3104")).to be(1)}
|
131
|
+
it { expect(@role.id(/studio310\d/)).to eq([1,2])}
|
132
|
+
it { expect(@role.name(1)).to eq("studio3104")}
|
133
|
+
|
134
|
+
context "set, get and delete attribute of a role" do
|
135
|
+
it { @role.set_attr("studio3104", { A: "apple", B: "banana", C: "chocolate" }) }
|
136
|
+
it { expect(@role.get_attr("studio3104")).to eq({ A: "apple", B: "banana", C: "chocolate" }) }
|
137
|
+
it { expect(@role.get_attr_json("studio3104")).to eq("{\"A\":\"apple\",\"B\":\"banana\",\"C\":\"chocolate\"}") }
|
138
|
+
it { expect(@role.get_attr("studio3104", "A")).to eq({ A: "apple" }) }
|
139
|
+
it { expect(@role.get_attr("invalid_role")).to eq({}) }
|
140
|
+
it { expect(@role.get_attr_json("invalid_role")).to eq("{}") }
|
141
|
+
|
142
|
+
it { expect { @role.set_attr("studio3104", { "A" => "anpanman" }) }.to(
|
143
|
+
raise_error(Houcho::AttributeExceptiotn, "attribute has already defined value in role - A")
|
144
|
+
)}
|
145
|
+
|
146
|
+
it "force set" do
|
147
|
+
expect(@role.set_attr!("studio3104", { "A" => "anpanman" }))
|
148
|
+
end
|
149
|
+
|
150
|
+
it { expect { @role.set_attr("invalid_role",{ A: "apple", B: "banana", C: "chocolate" }) }.to(
|
151
|
+
raise_error(Houcho::RoleExistenceException, "role does not exist - invalid_role")
|
152
|
+
) }
|
153
|
+
|
154
|
+
it { expect(@role.del_attr("studio3104", "C")).to eq({ :C => "chocolate" }) }
|
155
|
+
it { expect(@role.get_attr("studio3104")).to eq({ A: "anpanman", B: "banana" }) }
|
156
|
+
it { expect(@role.del_attr("studio3104")).to eq({ A: "anpanman", B: "banana" }) }
|
157
|
+
it { expect(@role.get_attr("studio3104")).to eq({}) }
|
158
|
+
end
|
74
159
|
end
|
75
160
|
|
76
161
|
|
77
162
|
describe Houcho::Host do
|
78
|
-
context
|
79
|
-
it {
|
80
|
-
it {
|
81
|
-
|
82
|
-
it
|
163
|
+
context "attach and detach hosts to roles" do
|
164
|
+
it { @host.attach(["host1", "host2"], ["studio3104", "studio3105"]) }
|
165
|
+
it { @host.detach(["host1", "host2"], ["studio3104", "studio3105"]) }
|
166
|
+
|
167
|
+
it do
|
168
|
+
expect { @host.attach("host1", "invalid_role") }.to(
|
169
|
+
raise_error(Houcho::RoleExistenceException, "role does not exist - invalid_role")
|
170
|
+
)
|
171
|
+
end
|
172
|
+
|
173
|
+
it do
|
174
|
+
expect { @host.detach("host1", "invalid_role") }.to(
|
175
|
+
raise_error(Houcho::RoleExistenceException, "role does not exist - invalid_role")
|
176
|
+
)
|
177
|
+
end
|
83
178
|
end
|
84
179
|
|
85
|
-
context
|
86
|
-
it
|
87
|
-
expect(
|
88
|
-
{
|
180
|
+
context "get details of a host" do
|
181
|
+
it "host from original defined" do
|
182
|
+
expect(@host.details(["hostA"])).to eq(
|
183
|
+
{ "hostA" => { "role" => [ "studio3104" ] } }
|
89
184
|
)
|
90
185
|
end
|
91
186
|
|
92
|
-
it
|
93
|
-
expect(
|
94
|
-
{
|
187
|
+
it "host from cf defined" do
|
188
|
+
expect(@host.details(["test1.studio3104.com"])).to eq(
|
189
|
+
{ "test1.studio3104.com" => { "outer role" => [ "houcho::rspec::studio3104" ] } }
|
95
190
|
)
|
96
191
|
end
|
97
192
|
|
98
|
-
it
|
99
|
-
expect(
|
193
|
+
it "both" do
|
194
|
+
expect(@host.details(["hostA", "test1.studio3104.com"])).to eq(
|
100
195
|
{
|
101
|
-
|
102
|
-
|
196
|
+
"hostA" => { "role" => [ "studio3104" ] },
|
197
|
+
"test1.studio3104.com" => { "outer role" => [ "houcho::rspec::studio3104" ] },
|
103
198
|
}
|
104
199
|
)
|
105
200
|
end
|
201
|
+
end
|
106
202
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
203
|
+
context "get host list attached or defined cf" do
|
204
|
+
it "all of hosts" do
|
205
|
+
expect(@host.list).to eq(["test1.studio3104.com", "test2.studio3104.com", "hostA"])
|
206
|
+
end
|
207
|
+
|
208
|
+
it "hosts of one of role" do
|
209
|
+
expect(@host.list(1)).to eq(["hostA"])
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
context "set, get and delete attribute of a host" do
|
214
|
+
it { @host.set_attr("hostA", { A: "apple", B: "banana", C: "chocolate" }) }
|
215
|
+
it { expect(@host.get_attr("hostA")).to eq({ A: "apple", B: "banana", C: "chocolate" }) }
|
216
|
+
it { expect(@host.get_attr_json("hostA")).to eq("{\"A\":\"apple\",\"B\":\"banana\",\"C\":\"chocolate\"}") }
|
217
|
+
it { expect(@host.get_attr("hostA", "A")).to eq({ A: "apple" }) }
|
218
|
+
it { expect(@host.get_attr("hostX")).to eq({}) }
|
219
|
+
it { expect(@host.get_attr_json("hostX")).to eq("{}") }
|
220
|
+
|
221
|
+
it { expect { @host.set_attr("hostA", { "A" => "anpanman" }) }.to(
|
222
|
+
raise_error(Houcho::AttributeExceptiotn, "attribute has already defined value in host - A")
|
223
|
+
)}
|
224
|
+
|
225
|
+
it "force set" do
|
226
|
+
expect(@host.set_attr!("hostA", { "A" => "anpanman" }))
|
227
|
+
end
|
228
|
+
|
229
|
+
it { expect { @host.set_attr("hostX",{ A: "apple", B: "banana", C: "chocolate" }) }.to(
|
230
|
+
raise_error(Houcho::HostExistenceException, "host does not exist - hostX")
|
231
|
+
) }
|
232
|
+
|
233
|
+
it { expect(@host.del_attr("hostA", "C")).to eq({ :C => "chocolate" }) }
|
234
|
+
it { expect(@host.get_attr("hostA")).to eq({ A: "anpanman", B: "banana" }) }
|
235
|
+
it { expect(@host.del_attr("hostA")).to eq({ A: "anpanman", B: "banana" }) }
|
236
|
+
it { expect(@host.get_attr("hostA")).to eq({}) }
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
|
241
|
+
describe Houcho::Spec do
|
242
|
+
context "get details of a spec" do
|
243
|
+
it "host from original defined" do
|
244
|
+
expect(@spec.details(["specA"])).to eq(
|
245
|
+
{ "specA" => { "role" => [ "studio3104" ] } }
|
246
|
+
)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
context "attach and detach hosts to roles" do
|
251
|
+
it { @spec.attach(["specA", "specB"], ["studio3104", "studio3105"]) }
|
252
|
+
it { @spec.detach("specB", ["studio3104", "studio3105"]) }
|
253
|
+
|
254
|
+
it do
|
255
|
+
expect { @spec.attach("specA", "invalid_role") }.to(
|
256
|
+
raise_error(Houcho::RoleExistenceException, "role does not exist - invalid_role")
|
257
|
+
)
|
258
|
+
end
|
259
|
+
|
260
|
+
it do
|
261
|
+
expect { @spec.detach("specA", "invalid_role") }.to(
|
262
|
+
raise_error(Houcho::RoleExistenceException, "role does not exist - invalid_role")
|
263
|
+
)
|
264
|
+
end
|
265
|
+
|
266
|
+
it do
|
267
|
+
expect { @spec.attach("invalid_spec", "studio3104") }.to(
|
268
|
+
raise_error(Houcho::SpecFileException, "No such spec file - invalid_spec")
|
269
|
+
)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
context "delete spec file" do
|
274
|
+
it {
|
275
|
+
@spec.check_existence("specC")
|
276
|
+
@spec.delete("specC")
|
277
|
+
expect { @spec.check_existence("specC") }.to(
|
278
|
+
raise_error(Houcho::SpecFileException, "No such spec file - specC")
|
279
|
+
)
|
280
|
+
}
|
281
|
+
it { expect { @spec.delete("specX") }.to(
|
282
|
+
raise_error(Houcho::SpecFileException, "No such spec file - specX")
|
283
|
+
) }
|
284
|
+
it { expect { @spec.delete("specA") }.to(
|
285
|
+
raise_error(Houcho::SpecFileException,"spec file has been attached to role - specA")
|
286
|
+
) }
|
287
|
+
it "force delete" do
|
288
|
+
@spec.check_existence("specA")
|
289
|
+
@spec.delete!("specA")
|
290
|
+
expect { @spec.check_existence("specA") }.to(
|
291
|
+
raise_error(Houcho::SpecFileException, "No such spec file - specA")
|
292
|
+
)
|
293
|
+
end
|
294
|
+
it {
|
295
|
+
File.write("#{Houcho::Config::SPECDIR}/specA_spec.rb"," ")
|
296
|
+
File.write("#{Houcho::Config::SPECDIR}/specC_spec.rb"," ")
|
297
|
+
@spec.attach("specA", ["studio3104", "studio3105"])
|
298
|
+
}
|
299
|
+
end
|
300
|
+
|
301
|
+
context "rename a spec file" do
|
302
|
+
it { @spec.rename("specC", "specSE") }
|
303
|
+
|
304
|
+
it { expect { @spec.rename("specX", "specXXX") }.to(
|
305
|
+
raise_error(Houcho::SpecFileException, "No such spec file - specX")
|
306
|
+
) }
|
307
|
+
|
308
|
+
it { expect { @spec.rename("specSE", "specA") }.to(
|
309
|
+
raise_error(Houcho::SpecFileException, "spec file already exist - specA")
|
310
|
+
) }
|
311
|
+
|
312
|
+
it { @spec.rename("specSE", "specC") }
|
313
|
+
end
|
314
|
+
end
|
111
315
|
|
112
|
-
|
113
|
-
|
114
|
-
|
316
|
+
|
317
|
+
describe Houcho::OuterRole do
|
318
|
+
context "set, get and delete attribute of a role" do
|
319
|
+
it { @outerrole.set_attr(
|
320
|
+
"houcho::rspec::studio3104",
|
321
|
+
{ A: "apple", B: "banana", C: "chocolate" }
|
322
|
+
) }
|
323
|
+
it { expect(@outerrole.get_attr("houcho::rspec::studio3104")).to(
|
324
|
+
eq({ A: "apple", B: "banana", C: "chocolate" })
|
325
|
+
) }
|
326
|
+
it { expect(@outerrole.get_attr_json("houcho::rspec::studio3104")).to(
|
327
|
+
eq("{\"A\":\"apple\",\"B\":\"banana\",\"C\":\"chocolate\"}")
|
328
|
+
) }
|
329
|
+
it { expect(@outerrole.get_attr("houcho::rspec::studio3104", "A")).to(
|
330
|
+
eq({ A: "apple" })
|
331
|
+
) }
|
332
|
+
it { expect(@outerrole.get_attr("invalid_role")).to eq({}) }
|
333
|
+
it { expect(@outerrole.get_attr_json("invalid_role")).to eq("{}") }
|
334
|
+
|
335
|
+
it { expect { @outerrole.set_attr(
|
336
|
+
"houcho::rspec::studio3104", { "A" => "anpanman" }
|
337
|
+
) }.to(
|
338
|
+
raise_error(
|
339
|
+
Houcho::AttributeExceptiotn,
|
340
|
+
"attribute has already defined value in outerrole - A"
|
341
|
+
)
|
342
|
+
) }
|
343
|
+
|
344
|
+
it "force set" do
|
345
|
+
expect(@outerrole.set_attr!("houcho::rspec::studio3104", { "A" => "anpanman" }))
|
115
346
|
end
|
347
|
+
|
348
|
+
it { expect { @outerrole.set_attr("invalid_role",{ A: "apple", B: "banana", C: "chocolate" }) }.to(
|
349
|
+
raise_error(Houcho::OuterRoleExistenceException, "outer role does not exist - invalid_role")
|
350
|
+
) }
|
351
|
+
|
352
|
+
it { expect(@outerrole.del_attr("houcho::rspec::studio3104", "C")).to eq({ :C => "chocolate" }) }
|
353
|
+
it { expect(@outerrole.get_attr("houcho::rspec::studio3104")).to eq({ A: "anpanman", B: "banana" }) }
|
354
|
+
it { expect(@outerrole.del_attr("houcho::rspec::studio3104")).to eq({ A: "anpanman", B: "banana" }) }
|
355
|
+
it { expect(@outerrole.get_attr("houcho::rspec::studio3104")).to eq({}) }
|
116
356
|
end
|
117
357
|
end
|
118
358
|
|
119
359
|
|
120
360
|
describe Houcho::Spec::Runner do
|
121
|
-
context
|
361
|
+
context "run role" do
|
122
362
|
it do
|
123
|
-
expect(
|
124
|
-
|
125
|
-
|
126
|
-
|
363
|
+
expect(@specrunner.execute_role("studio3104", [], true)).to eq([
|
364
|
+
"TARGET_HOST=hostA parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb",
|
365
|
+
"TARGET_HOST=test1.studio3104.com parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb",
|
366
|
+
"TARGET_HOST=test2.studio3104.com parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb"
|
127
367
|
])
|
128
368
|
end
|
129
369
|
|
130
|
-
it
|
131
|
-
expect(
|
132
|
-
|
133
|
-
|
370
|
+
it "with exclude host" do
|
371
|
+
expect(@specrunner.execute_role("studio3104", "test1.studio3104.com", true)).to eq([
|
372
|
+
"TARGET_HOST=hostA parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb",
|
373
|
+
"TARGET_HOST=test2.studio3104.com parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb"
|
134
374
|
])
|
135
375
|
end
|
136
376
|
end
|
137
377
|
|
138
|
-
context
|
378
|
+
context "run manually" do
|
139
379
|
it do
|
140
|
-
expect(
|
141
|
-
|
142
|
-
|
380
|
+
expect(@specrunner.execute_manually(
|
381
|
+
["test3.studio3104.com", "test4.studio3104.com"],
|
382
|
+
"specA",
|
383
|
+
true
|
384
|
+
)).to eq([
|
385
|
+
"TARGET_HOST=test3.studio3104.com parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb",
|
386
|
+
"TARGET_HOST=test4.studio3104.com parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb"
|
143
387
|
])
|
144
388
|
end
|
145
389
|
|
146
|
-
it
|
147
|
-
expect {
|
390
|
+
it "case of spec not exist" do
|
391
|
+
expect { @specrunner.execute_manually("test5.studio3104.com", ["specA", "specX"], true) }.to(
|
392
|
+
raise_error Houcho::SpecFileException, "No such spec file - specX"
|
393
|
+
)
|
148
394
|
end
|
149
395
|
end
|
150
396
|
|
151
|
-
context
|
152
|
-
it { expect(
|
153
|
-
|
154
|
-
|
397
|
+
context "check spec" do
|
398
|
+
it { expect(@specrunner.check("specA", 2, true).size).to be(2) }
|
399
|
+
|
400
|
+
it "case of spec not exist" do
|
401
|
+
expect { @specrunner.check("specX", 2) }.to(
|
402
|
+
raise_error Houcho::SpecFileException, "No such spec file - specX"
|
403
|
+
)
|
155
404
|
end
|
156
405
|
end
|
157
406
|
end
|
158
|
-
|
159
|
-
|
160
|
-
after :all do
|
161
|
-
Dir.chdir('/')
|
162
|
-
FileUtils.rm_rf(spectmp)
|
163
|
-
end
|
164
407
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: houcho
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Satoshi SUZUKI
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-08-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: parallel
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - '>='
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - '>='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: sqlite3-ruby
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: bundler
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,38 +160,34 @@ extra_rdoc_files: []
|
|
146
160
|
files:
|
147
161
|
- .gitignore
|
148
162
|
- Gemfile
|
163
|
+
- Gemfile.lock
|
149
164
|
- LICENSE.txt
|
150
165
|
- README.md
|
151
166
|
- Rakefile
|
152
167
|
- bin/houcho
|
153
168
|
- houcho.gemspec
|
154
169
|
- lib/houcho.rb
|
170
|
+
- lib/houcho/attribute.rb
|
155
171
|
- lib/houcho/ci.rb
|
156
|
-
- lib/houcho/
|
157
|
-
- lib/houcho/
|
158
|
-
- lib/houcho/
|
172
|
+
- lib/houcho/cli.rb
|
173
|
+
- lib/houcho/cli/attribute.rb
|
174
|
+
- lib/houcho/cli/host.rb
|
175
|
+
- lib/houcho/cli/outerrole.rb
|
176
|
+
- lib/houcho/cli/role.rb
|
177
|
+
- lib/houcho/cli/spec.rb
|
178
|
+
- lib/houcho/config.rb
|
179
|
+
- lib/houcho/database.rb
|
159
180
|
- lib/houcho/element.rb
|
160
181
|
- lib/houcho/host.rb
|
182
|
+
- lib/houcho/outerrole.rb
|
183
|
+
- lib/houcho/outerrole/cloudforecast.rb
|
184
|
+
- lib/houcho/outerrole/yabitz.rb
|
185
|
+
- lib/houcho/repository.rb
|
161
186
|
- lib/houcho/role.rb
|
162
187
|
- lib/houcho/spec.rb
|
163
188
|
- lib/houcho/spec/runner.rb
|
164
189
|
- lib/houcho/version.rb
|
165
|
-
- lib/houcho/yamlhandle.rb
|
166
190
|
- spec/houcho_spec.rb
|
167
|
-
- spec/spec_helper.rb
|
168
|
-
- templates/conf/houcho.conf
|
169
|
-
- templates/conf/kk.rb
|
170
|
-
- templates/conf/rspec.conf
|
171
|
-
- templates/master
|
172
|
-
- templates/role/cf_roles.yaml
|
173
|
-
- templates/role/cloudforecast.yaml
|
174
|
-
- templates/role/cloudforecast/.gitkeep
|
175
|
-
- templates/role/hosts.yaml
|
176
|
-
- templates/role/hosts_ignored.yaml
|
177
|
-
- templates/role/roles.yaml
|
178
|
-
- templates/role/specs.yaml
|
179
|
-
- templates/spec/sample_spec.rb
|
180
|
-
- templates/spec/spec_helper.rb
|
181
191
|
homepage: https://github.com/studio3104/houcho
|
182
192
|
licenses:
|
183
193
|
- MIT
|
@@ -204,4 +214,3 @@ specification_version: 4
|
|
204
214
|
summary: covering to run serverspec
|
205
215
|
test_files:
|
206
216
|
- spec/houcho_spec.rb
|
207
|
-
- spec/spec_helper.rb
|