skewer 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.idea/skewer.iml +23 -20
- data/Gemfile.lock +47 -36
- data/Rakefile +2 -2
- data/assets/rubygems.sh +2 -2
- data/bin/skewer +0 -1
- data/features/hooks.feature +23 -9
- data/features/rackspace.feature +9 -9
- data/features/support/puppetcode/manifests/classes/apache.pp +3 -0
- data/features/support/puppetcode/manifests/site.pp +2 -1
- data/features/support/puppetcode/modules/apache/manifests/install.pp +16 -0
- data/features/update.feature +3 -2
- data/hook-test/Gemfile +6 -0
- data/hook-test/features/default_web_page.feature +9 -0
- data/hook-test/features/step_definitions/steps.rb +9 -0
- data/hook-test/features/support/env.rb +3 -0
- data/lib/bootstrapper.rb +1 -1
- data/lib/cli.rb +4 -2
- data/lib/cuke.rb +7 -7
- data/lib/parser.rb +3 -0
- data/lib/rackspace/images.rb +18 -7
- data/lib/rackspace/node.rb +31 -20
- data/lib/rackspace/service.rb +23 -0
- data/lib/skewer/version.rb +1 -1
- data/lib/source.rb +0 -1
- data/skewer.gemspec +1 -1
- data/spec/bootstrapper_spec.rb +1 -1
- data/spec/cuke_spec.rb +0 -11
- data/spec/rackspace/images_spec.rb +1 -1
- data/spec/rackspace/node_spec.rb +1 -2
- data/spec/rackspace/service_spec.rb +19 -0
- data/spec/source_spec.rb +1 -1
- metadata +19 -10
data/.idea/skewer.iml
CHANGED
@@ -5,57 +5,60 @@
|
|
5
5
|
<orderEntry type="inheritedJdk" />
|
6
6
|
<orderEntry type="sourceFolder" forTests="false" />
|
7
7
|
<orderEntry type="library" scope="PROVIDED" name="Saikuro (v1.1.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
8
|
-
<orderEntry type="library" scope="PROVIDED" name="activesupport (v3.2.
|
8
|
+
<orderEntry type="library" scope="PROVIDED" name="activesupport (v3.2.3, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
9
9
|
<orderEntry type="library" scope="PROVIDED" name="archive-tar-minitar (v0.5.2, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
10
|
+
<orderEntry type="library" scope="PROVIDED" name="arrayfields (v4.7.4, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
10
11
|
<orderEntry type="library" scope="PROVIDED" name="aruba (v0.4.11, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
11
12
|
<orderEntry type="library" scope="PROVIDED" name="builder (v3.0.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
12
|
-
<orderEntry type="library" scope="PROVIDED" name="bundler (v1.1.
|
13
|
+
<orderEntry type="library" scope="PROVIDED" name="bundler (v1.1.3, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
13
14
|
<orderEntry type="library" scope="PROVIDED" name="childprocess (v0.3.1, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
14
15
|
<orderEntry type="library" scope="PROVIDED" name="chronic (v0.3.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
15
|
-
<orderEntry type="library" scope="PROVIDED" name="churn (v0.0.
|
16
|
+
<orderEntry type="library" scope="PROVIDED" name="churn (v0.0.15, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
16
17
|
<orderEntry type="library" scope="PROVIDED" name="colored (v1.2, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
17
18
|
<orderEntry type="library" scope="PROVIDED" name="cucumber (v1.1.9, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
18
19
|
<orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.1.3, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
19
20
|
<orderEntry type="library" scope="PROVIDED" name="erubis (v2.7.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
20
21
|
<orderEntry type="library" scope="PROVIDED" name="excon (v0.9.6, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
22
|
+
<orderEntry type="library" scope="PROVIDED" name="fattr (v2.2.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
21
23
|
<orderEntry type="library" scope="PROVIDED" name="ffi (v1.0.11, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
22
24
|
<orderEntry type="library" scope="PROVIDED" name="flay (v1.4.3, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
23
25
|
<orderEntry type="library" scope="PROVIDED" name="flog (v2.5.3, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
24
26
|
<orderEntry type="library" scope="PROVIDED" name="fog (v1.1.2, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
25
27
|
<orderEntry type="library" scope="PROVIDED" name="formatador (v0.2.1, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
26
|
-
<orderEntry type="library" scope="PROVIDED" name="gherkin (v2.9.
|
28
|
+
<orderEntry type="library" scope="PROVIDED" name="gherkin (v2.9.3, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
27
29
|
<orderEntry type="library" scope="PROVIDED" name="git (v1.2.5, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
28
|
-
<orderEntry type="library" scope="PROVIDED" name="hirb (v0.
|
30
|
+
<orderEntry type="library" scope="PROVIDED" name="hirb (v0.5.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
29
31
|
<orderEntry type="library" scope="PROVIDED" name="i18n (v0.6.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
30
32
|
<orderEntry type="library" scope="PROVIDED" name="jeweler (v1.8.3, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
31
|
-
<orderEntry type="library" scope="PROVIDED" name="json (v1.
|
32
|
-
<orderEntry type="library" scope="PROVIDED" name="json_pure (v1.6.
|
33
|
-
<orderEntry type="library" scope="PROVIDED" name="log4r (v1.1.10, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
33
|
+
<orderEntry type="library" scope="PROVIDED" name="json (v1.6.1, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
34
|
+
<orderEntry type="library" scope="PROVIDED" name="json_pure (v1.6.6, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
34
35
|
<orderEntry type="library" scope="PROVIDED" name="main (v4.7.1, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
36
|
+
<orderEntry type="library" scope="PROVIDED" name="map (v4.3.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
37
|
+
<orderEntry type="library" scope="PROVIDED" name="mario (v0.0.6, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
35
38
|
<orderEntry type="library" scope="PROVIDED" name="metric_fu (v2.1.1, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
36
|
-
<orderEntry type="library" scope="PROVIDED" name="mime-types (v1.
|
39
|
+
<orderEntry type="library" scope="PROVIDED" name="mime-types (v1.18, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
37
40
|
<orderEntry type="library" scope="PROVIDED" name="multi_json (v1.0.4, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
38
41
|
<orderEntry type="library" scope="PROVIDED" name="net-scp (v1.0.4, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
39
|
-
<orderEntry type="library" scope="PROVIDED" name="net-ssh (v2.
|
40
|
-
<orderEntry type="library" scope="PROVIDED" name="nokogiri (v1.5.
|
41
|
-
<orderEntry type="library" scope="PROVIDED" name="progressbar (v0.
|
42
|
+
<orderEntry type="library" scope="PROVIDED" name="net-ssh (v2.3.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
43
|
+
<orderEntry type="library" scope="PROVIDED" name="nokogiri (v1.5.2, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
44
|
+
<orderEntry type="library" scope="PROVIDED" name="progressbar (v0.11.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
42
45
|
<orderEntry type="library" scope="PROVIDED" name="rails_best_practices (v1.9.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
43
46
|
<orderEntry type="library" scope="PROVIDED" name="rake (v0.9.2.2, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
44
47
|
<orderEntry type="library" scope="PROVIDED" name="rcov (v1.0.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
45
|
-
<orderEntry type="library" scope="PROVIDED" name="rdoc (v3.12, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
46
48
|
<orderEntry type="library" scope="PROVIDED" name="reek (v1.2.8, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
47
49
|
<orderEntry type="library" scope="PROVIDED" name="roodi (v2.1.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
48
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec (v2.
|
49
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec-core (v2.
|
50
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v2.
|
51
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v2.
|
50
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec (v2.9.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
51
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-core (v2.9.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
52
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v2.9.1, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
53
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v2.9.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
52
54
|
<orderEntry type="library" scope="PROVIDED" name="ruby-hmac (v0.4.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
53
55
|
<orderEntry type="library" scope="PROVIDED" name="ruby2ruby (v1.3.1, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
54
|
-
<orderEntry type="library" scope="PROVIDED" name="ruby_parser (v2.
|
55
|
-
<orderEntry type="library" scope="PROVIDED" name="sexp_processor (v3.0.
|
56
|
+
<orderEntry type="library" scope="PROVIDED" name="ruby_parser (v2.3.1, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
57
|
+
<orderEntry type="library" scope="PROVIDED" name="sexp_processor (v3.0.7, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
56
58
|
<orderEntry type="library" scope="PROVIDED" name="syntax (v1.0.0, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
57
59
|
<orderEntry type="library" scope="PROVIDED" name="term-ansicolor (v1.0.7, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
58
|
-
<orderEntry type="library" scope="PROVIDED" name="vagrant (
|
60
|
+
<orderEntry type="library" scope="PROVIDED" name="vagrant (v1.0.2, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
61
|
+
<orderEntry type="library" scope="PROVIDED" name="virtualbox (v0.7.5, RVM: ruby-1.8.7-p352) [gem]" level="application" />
|
59
62
|
</component>
|
60
63
|
</module>
|
61
64
|
|
data/Gemfile.lock
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
skewer (0.0
|
4
|
+
skewer (0.1.0)
|
5
5
|
fog (~> 1.1.2)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: http://rubygems.org/
|
9
9
|
specs:
|
10
10
|
Saikuro (1.1.0)
|
11
|
-
activesupport (3.2.
|
11
|
+
activesupport (3.2.3)
|
12
12
|
i18n (~> 0.6)
|
13
13
|
multi_json (~> 1.0)
|
14
14
|
archive-tar-minitar (0.5.2)
|
15
|
+
arrayfields (4.7.4)
|
15
16
|
aruba (0.4.11)
|
16
17
|
childprocess (>= 0.2.3)
|
17
18
|
cucumber (>= 1.1.1)
|
@@ -21,12 +22,22 @@ GEM
|
|
21
22
|
childprocess (0.3.1)
|
22
23
|
ffi (~> 1.0.6)
|
23
24
|
chronic (0.3.0)
|
24
|
-
churn (0.0.
|
25
|
+
churn (0.0.15)
|
26
|
+
arrayfields (= 4.7.4)
|
25
27
|
chronic (>= 0.2.3)
|
28
|
+
chronic (>= 0.2.3)
|
29
|
+
fattr (= 2.2.0)
|
30
|
+
hirb (= 0.5.0)
|
26
31
|
hirb
|
32
|
+
jeweler (= 1.6.4)
|
33
|
+
json (= 1.6.1)
|
27
34
|
json_pure
|
28
35
|
main
|
29
|
-
|
36
|
+
main (>= 4.6.0)
|
37
|
+
map (= 4.3.0)
|
38
|
+
ruby_parser (= 2.3.1)
|
39
|
+
ruby_parser (~> 2.3)
|
40
|
+
sexp_processor (= 3.0.7)
|
30
41
|
sexp_processor (~> 3.0.3)
|
31
42
|
colored (1.2)
|
32
43
|
cucumber (1.1.9)
|
@@ -38,6 +49,7 @@ GEM
|
|
38
49
|
diff-lcs (1.1.3)
|
39
50
|
erubis (2.7.0)
|
40
51
|
excon (0.9.6)
|
52
|
+
fattr (2.2.0)
|
41
53
|
ffi (1.0.11)
|
42
54
|
flay (1.4.3)
|
43
55
|
ruby_parser (~> 2.0)
|
@@ -56,20 +68,20 @@ GEM
|
|
56
68
|
nokogiri (~> 1.5.0)
|
57
69
|
ruby-hmac
|
58
70
|
formatador (0.2.1)
|
59
|
-
gherkin (2.9.
|
71
|
+
gherkin (2.9.3)
|
60
72
|
json (>= 1.4.6)
|
61
73
|
git (1.2.5)
|
62
|
-
hirb (0.
|
74
|
+
hirb (0.5.0)
|
63
75
|
i18n (0.6.0)
|
64
|
-
jeweler (1.
|
76
|
+
jeweler (1.6.4)
|
65
77
|
bundler (~> 1.0)
|
66
78
|
git (>= 1.2.5)
|
67
79
|
rake
|
68
|
-
|
69
|
-
|
70
|
-
json_pure (1.6.5)
|
71
|
-
log4r (1.1.10)
|
80
|
+
json (1.6.1)
|
81
|
+
json_pure (1.6.6)
|
72
82
|
main (4.7.1)
|
83
|
+
map (4.3.0)
|
84
|
+
mario (0.0.6)
|
73
85
|
metric_fu (2.1.1)
|
74
86
|
Saikuro (>= 1.1.0)
|
75
87
|
activesupport (>= 2.0.0)
|
@@ -82,13 +94,13 @@ GEM
|
|
82
94
|
reek (>= 1.2.6)
|
83
95
|
roodi (>= 2.1.0)
|
84
96
|
syntax
|
85
|
-
mime-types (1.
|
97
|
+
mime-types (1.18)
|
86
98
|
multi_json (1.0.4)
|
87
99
|
net-scp (1.0.4)
|
88
100
|
net-ssh (>= 1.99.1)
|
89
|
-
net-ssh (2.
|
90
|
-
nokogiri (1.5.
|
91
|
-
progressbar (0.
|
101
|
+
net-ssh (2.3.0)
|
102
|
+
nokogiri (1.5.2)
|
103
|
+
progressbar (0.11.0)
|
92
104
|
rails_best_practices (1.9.0)
|
93
105
|
activesupport
|
94
106
|
colored
|
@@ -98,40 +110,39 @@ GEM
|
|
98
110
|
sexp_processor
|
99
111
|
rake (0.9.2.2)
|
100
112
|
rcov (1.0.0)
|
101
|
-
rdoc (3.12)
|
102
|
-
json (~> 1.4)
|
103
113
|
reek (1.2.8)
|
104
114
|
ruby2ruby (~> 1.2)
|
105
115
|
ruby_parser (~> 2.0)
|
106
116
|
sexp_processor (~> 3.0)
|
107
117
|
roodi (2.1.0)
|
108
118
|
ruby_parser
|
109
|
-
rspec (2.
|
110
|
-
rspec-core (~> 2.
|
111
|
-
rspec-expectations (~> 2.
|
112
|
-
rspec-mocks (~> 2.
|
113
|
-
rspec-core (2.
|
114
|
-
rspec-expectations (2.
|
115
|
-
diff-lcs (~> 1.1.
|
116
|
-
rspec-mocks (2.
|
119
|
+
rspec (2.9.0)
|
120
|
+
rspec-core (~> 2.9.0)
|
121
|
+
rspec-expectations (~> 2.9.0)
|
122
|
+
rspec-mocks (~> 2.9.0)
|
123
|
+
rspec-core (2.9.0)
|
124
|
+
rspec-expectations (2.9.1)
|
125
|
+
diff-lcs (~> 1.1.3)
|
126
|
+
rspec-mocks (2.9.0)
|
117
127
|
ruby-hmac (0.4.0)
|
118
128
|
ruby2ruby (1.3.1)
|
119
129
|
ruby_parser (~> 2.0)
|
120
130
|
sexp_processor (~> 3.0)
|
121
|
-
ruby_parser (2.
|
131
|
+
ruby_parser (2.3.1)
|
122
132
|
sexp_processor (~> 3.0)
|
123
|
-
sexp_processor (3.0.
|
133
|
+
sexp_processor (3.0.7)
|
124
134
|
syntax (1.0.0)
|
125
135
|
term-ansicolor (1.0.7)
|
126
|
-
vagrant (0.
|
136
|
+
vagrant (0.5.4)
|
127
137
|
archive-tar-minitar (= 0.5.2)
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
138
|
+
erubis (>= 2.6.6)
|
139
|
+
json (>= 1.4.3)
|
140
|
+
mario (~> 0.0.6)
|
141
|
+
net-scp (>= 1.0.2)
|
142
|
+
net-ssh (>= 2.0.19)
|
143
|
+
virtualbox (~> 0.7.3)
|
144
|
+
virtualbox (0.7.5)
|
145
|
+
ffi (>= 0.6.3)
|
135
146
|
|
136
147
|
PLATFORMS
|
137
148
|
ruby
|
@@ -143,4 +154,4 @@ DEPENDENCIES
|
|
143
154
|
rcov (~> 1.0.0)
|
144
155
|
rspec
|
145
156
|
skewer!
|
146
|
-
vagrant
|
157
|
+
vagrant
|
data/Rakefile
CHANGED
@@ -8,7 +8,7 @@ require 'metric_fu'
|
|
8
8
|
require 'rake'
|
9
9
|
require 'rake/clean'
|
10
10
|
require 'rspec/core/rake_task'
|
11
|
-
require 'vagrant'
|
11
|
+
#require 'vagrant'
|
12
12
|
|
13
13
|
CLEAN.include ['coverage', 'target', '/tmp/skewer_test_code', '/tmp/more_skewer_test_code', '.skewer.json', '/tmp/skewer*']
|
14
14
|
|
@@ -56,4 +56,4 @@ RSpec::Core::RakeTask.new("spec:coverage") do |t|
|
|
56
56
|
end
|
57
57
|
|
58
58
|
task :default => [:clean, :spec]
|
59
|
-
task :features => :vagrant_up
|
59
|
+
#task :features => :vagrant_up
|
data/assets/rubygems.sh
CHANGED
@@ -33,7 +33,7 @@ EOF
|
|
33
33
|
|
34
34
|
chmod 0755 /etc/profile.d/rubygems.sh
|
35
35
|
. /etc/profile.d/rubygems.sh
|
36
|
-
|
37
|
-
|
36
|
+
apt-get update >/dev/null
|
37
|
+
apt-get install -y rsync ruby rubygems libopenssl-ruby ruby-dev build-essential libxml2-dev libxslt-dev
|
38
38
|
gem install bundler --no-rdoc --no-ri
|
39
39
|
gem install json --no-rdoc --no-ri
|
data/bin/skewer
CHANGED
data/features/hooks.feature
CHANGED
@@ -3,13 +3,27 @@ Feature: Hooks
|
|
3
3
|
As a user
|
4
4
|
I want it to execute a command when it's finihsed
|
5
5
|
|
6
|
-
Scenario: accept hook on CLI
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
6
|
+
Scenario: accept hook on CLI
|
7
|
+
Given a file named "/tmp/skewer_hook" with:
|
8
|
+
"""
|
9
|
+
#!/bin/bash
|
10
|
+
echo $1 > /tmp/skewer_hook_result
|
11
|
+
"""
|
12
|
+
And I run `chmod +x /tmp/skewer_hook`
|
13
|
+
When I run `./bin/skewer provision --cloud stub --image foo --role bar --hook /tmp/skewer_hook`
|
14
|
+
Then the file "/tmp/skewer_hook_result" should exist
|
15
|
+
|
16
|
+
|
17
|
+
Scenario: run cucumber on completion
|
18
|
+
Given I have puppet code in "/tmp/skewer_test_code"
|
19
|
+
When I run `./bin/skewer provision --cloud ec2 --role apache --image ami-5c9b4935 --key testytesty --puppetcode /tmp/skewer_test_code --features hook-test/features`
|
20
|
+
Then the exit status should be 0
|
21
|
+
And the stdout should contain "Puppet run succeeded"
|
22
|
+
|
23
|
+
#@announce-stdout
|
24
|
+
#@announce-stderr
|
25
|
+
Scenario: failed cucumber should fail the run
|
26
|
+
Given I have puppet code in "/tmp/skewer_test_code"
|
27
|
+
When I run `./bin/skewer provision --cloud stub --role foobar --image ami-5c9b4935 --key testytesty --puppetcode /tmp/skewer_test_code --features hook-test/features`
|
28
|
+
Then the exit status should not be 0
|
15
29
|
|
data/features/rackspace.feature
CHANGED
@@ -3,8 +3,7 @@ Feature: provisioning a node on Rackspace
|
|
3
3
|
As someone who wants to deploy something to the machine
|
4
4
|
I want to run the provision command
|
5
5
|
|
6
|
-
|
7
|
-
@announce-stderr
|
6
|
+
|
8
7
|
Scenario: config in local file
|
9
8
|
Given I have puppet code in "/tmp/skewer_test_code"
|
10
9
|
And a file named ".skewer.json" with:
|
@@ -15,20 +14,21 @@ Feature: provisioning a node on Rackspace
|
|
15
14
|
"image_id":"112"
|
16
15
|
}
|
17
16
|
"""
|
18
|
-
When I run `./bin/skewer provision --cloud rackspace --role foobar --image 112`
|
17
|
+
When I run `./bin/skewer provision --cloud rackspace --role foobar --image 112 --region lon`
|
19
18
|
Then the stdout should contain "Evaluating cloud rackspace"
|
20
19
|
And the stdout should contain "Launching a Rackspace node"
|
20
|
+
And the exit status should be 0
|
21
|
+
|
21
22
|
|
22
|
-
@announce-stdout
|
23
|
-
@announce-stderr
|
24
23
|
Scenario: Build a machine with a specific flavor (RAM size)
|
25
|
-
Given I run `./bin/skewer provision --cloud rackspace --role foobar --image 112 --flavor 3`
|
24
|
+
Given I run `./bin/skewer provision --cloud rackspace --role foobar --image 112 --flavor 3 --puppetcode /tmp/skewer_test_code --region lon`
|
26
25
|
Then the stdout should contain "Evaluating cloud rackspace"
|
27
26
|
And the stdout should contain "Launching a Rackspace node"
|
27
|
+
And the exit status should be 0
|
28
|
+
|
28
29
|
|
29
|
-
@announce-stdout
|
30
|
-
@announce-stderr
|
31
30
|
Scenario: Build a machine with a symbolic image ID
|
32
|
-
Given I run `./bin/skewer provision --cloud rackspace --role foobar --image ubuntu1104 --flavor 2`
|
31
|
+
Given I run `./bin/skewer provision --cloud rackspace --role foobar --image ubuntu1104 --flavor 2 --puppetcode /tmp/skewer_test_code --region lon`
|
33
32
|
Then the stdout should contain "Evaluating cloud rackspace"
|
34
33
|
And the stdout should contain "Launching a Rackspace node"
|
34
|
+
And the exit status should be 0
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class apache::install {
|
2
|
+
package {
|
3
|
+
'apache2': ensure => present
|
4
|
+
}
|
5
|
+
file {
|
6
|
+
'/var/www/index.html':
|
7
|
+
ensure => present,
|
8
|
+
content => 'Puppet Run Success',
|
9
|
+
require => Package['apache2'];
|
10
|
+
}
|
11
|
+
service {
|
12
|
+
'apache2':
|
13
|
+
ensure => running,
|
14
|
+
require => Package['apache2'];
|
15
|
+
}
|
16
|
+
}
|
data/features/update.feature
CHANGED
@@ -7,6 +7,7 @@ Scenario: run the command without args
|
|
7
7
|
When I run `./bin/skewer update`
|
8
8
|
Then the exit status should not be 0
|
9
9
|
|
10
|
+
@wip
|
10
11
|
@announce-stdout @announce-stderr
|
11
12
|
Scenario: pass in a hostname user and role on passing puppet code
|
12
13
|
Given I have access to the internet
|
@@ -16,13 +17,13 @@ Scenario: pass in a hostname user and role on passing puppet code
|
|
16
17
|
And the stdout should contain "Using Puppet Code from /tmp/skewer_test_code/"
|
17
18
|
And the stdout should contain "Puppet run succeeded"
|
18
19
|
|
19
|
-
|
20
|
+
@wip
|
20
21
|
@announce-stdout @announce-stderr
|
21
22
|
Scenario: pass in a hostname user and role on broken puppet code
|
22
23
|
Given I have access to the internet
|
23
24
|
And I have puppet code in "/tmp/skewer_test_code"
|
24
25
|
When I run `./bin/skewer update --host default --user vagrant --role foobroken --puppetcode /tmp/skewer_test_code/`
|
25
|
-
Then the exit status should be 0
|
26
|
+
Then the exit status should not be 0
|
26
27
|
And the stdout should contain "Using Puppet Code from /tmp/skewer_test_code/"
|
27
28
|
And the stdout should contain "Puppet failed"
|
28
29
|
|
data/hook-test/Gemfile
ADDED
data/lib/bootstrapper.rb
CHANGED
data/lib/cli.rb
CHANGED
@@ -34,7 +34,7 @@ module Skewer
|
|
34
34
|
when :rackspace
|
35
35
|
require 'rackspace/node'
|
36
36
|
Skewer.logger.debug 'Launching a Rackspace node'
|
37
|
-
node = Rackspace::Node.new(@
|
37
|
+
node = Rackspace::Node.new(@config.get('flavor_id'), image, 'default').node
|
38
38
|
when :linode
|
39
39
|
raise "not implemented"
|
40
40
|
when :eucalyptus
|
@@ -78,10 +78,12 @@ module Skewer
|
|
78
78
|
Puppet.run(node, @options)
|
79
79
|
location = @util.get_location(node)
|
80
80
|
Hooks.new(location).run
|
81
|
+
|
82
|
+
Cuke.new(@config.get(:cuke_dir), location).run if @config.get(:cuke_dir)
|
81
83
|
Skewer.logger.debug "Node ready\n open http://#{location} or \n ssh -l #{node.username} #{location}"
|
82
|
-
Cuke.new(@config.get(:cuke_dir)).run if @config.get(:cuke_dir)
|
83
84
|
rescue Exception => exception
|
84
85
|
Skewer.logger.debug exception
|
86
|
+
raise "Something went wrong, and we killed the node"
|
85
87
|
ensure
|
86
88
|
destroy
|
87
89
|
end
|
data/lib/cuke.rb
CHANGED
@@ -6,18 +6,18 @@ module Skewer
|
|
6
6
|
# built.
|
7
7
|
class Cuke
|
8
8
|
class CukeError < RuntimeError; end
|
9
|
+
include Skewer
|
9
10
|
|
10
|
-
def initialize(dir = nil)
|
11
|
-
raise "you must provide a valid directory for features to be executed within"
|
11
|
+
def initialize(dir = nil, host = nil)
|
12
|
+
raise "you must provide a valid directory for features to be executed within" unless File.directory?(dir)
|
12
13
|
@dir = dir
|
13
|
-
|
14
|
-
|
15
|
-
def directory_exists?(dir)
|
16
|
-
File.directory?(dir)
|
14
|
+
@host = host
|
17
15
|
end
|
18
16
|
|
19
17
|
def run
|
20
|
-
|
18
|
+
Skewer.logger.debug("Running cucumber hook")
|
19
|
+
`cd #{@dir}/.. && bundle install` if File.join(@dir, '..', 'Gemfile')
|
20
|
+
result = `cucumber #{@dir} SKEWER_HOST=#{@host}`
|
21
21
|
parsed = result.match(/failed/)[0] rescue false
|
22
22
|
raise CukeError, "One of the cuke features failed!\n\n#{result}" if parsed
|
23
23
|
result
|
data/lib/parser.rb
CHANGED
data/lib/rackspace/images.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
module Skewer
|
2
2
|
module Rackspace
|
3
3
|
class Images
|
4
|
-
attr_reader :
|
4
|
+
attr_reader :distributions
|
5
5
|
|
6
6
|
def initialize
|
7
|
-
@
|
7
|
+
@distributions = {
|
8
8
|
'ubuntu1004' => { :id => 112, :name => "Ubuntu 10.04 LTS"},
|
9
9
|
'ubuntu1104' => { :id => 115, :name => "Ubuntu 11.04"},
|
10
10
|
'ubuntu1110' => { :id => 119, :name => "Ubuntu 11.10"},
|
@@ -13,12 +13,23 @@ module Skewer
|
|
13
13
|
|
14
14
|
# If provided a name for an image, give back the ID.
|
15
15
|
def get_id(name)
|
16
|
-
|
16
|
+
if name.nil?
|
17
|
+
return @distributions['ubuntu1004'][:id]
|
18
|
+
end
|
17
19
|
name = Integer(name) rescue name
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
|
21
|
+
if name.class == Fixnum
|
22
|
+
return name
|
23
|
+
end
|
24
|
+
|
25
|
+
unless name.class == String
|
26
|
+
return @distributions['ubuntu1004'][:id]
|
27
|
+
end
|
28
|
+
|
29
|
+
unless @distributions.has_key?(name)
|
30
|
+
raise "An image with the name '#{name}' doesn't exist"
|
31
|
+
end
|
32
|
+
@distributions[name][:id]
|
22
33
|
end
|
23
34
|
end
|
24
35
|
end
|
data/lib/rackspace/node.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'fog'
|
2
2
|
require 'rackspace/images'
|
3
|
+
require 'rackspace/service'
|
4
|
+
require 'config'
|
3
5
|
|
4
6
|
module Skewer
|
5
7
|
module Rackspace
|
@@ -9,42 +11,51 @@ module Skewer
|
|
9
11
|
|
10
12
|
# By default, boot an Ubuntu 10.04 LTS (lucid) server.
|
11
13
|
def initialize(flavor = 1, image = 112, name = 'my_server', instance = nil)
|
12
|
-
|
14
|
+
region = SkewerConfig.get('region')
|
15
|
+
connection = self.class.find_service(region)
|
13
16
|
|
14
17
|
# Get our SSH key to attach it to the server.
|
15
|
-
|
16
|
-
@node = instance
|
17
|
-
else
|
18
|
-
@node = build(connection, flavor, image, name)
|
19
|
-
end
|
18
|
+
instance ? @node = instance : @node = build(connection, flavor, image, name)
|
20
19
|
end
|
21
20
|
|
22
|
-
def self.find_service
|
23
|
-
|
24
|
-
:provider => 'Rackspace',
|
25
|
-
:rackspace_api_key => Fog.credentials[:rackspace_api_key],
|
26
|
-
:rackspace_username => Fog.credentials[:rackspace_username],
|
27
|
-
:rackspace_auth_url => "lon.auth.api.rackspacecloud.com")
|
21
|
+
def self.find_service(short_region = 'usa')
|
22
|
+
Skewer::Rackspace::Service.new(short_region).build
|
28
23
|
end
|
29
24
|
|
30
25
|
def build(connection, flavor, image, name)
|
31
|
-
|
32
|
-
path = File.expand_path '~/.ssh/id_dsa.pub' if not File.exist? path
|
33
|
-
raise "Couldn't find a public key" if not File.exist? path
|
34
|
-
key = File.open(path, 'rb').read
|
26
|
+
key = find_key()
|
35
27
|
|
36
|
-
images = Rackspace::Images.new
|
28
|
+
images = Skewer::Rackspace::Images.new
|
29
|
+
image_id = images.get_id(image)
|
37
30
|
options = {
|
38
31
|
:flavor_id => flavor,
|
39
|
-
:image_id =>
|
32
|
+
:image_id => image_id,
|
40
33
|
:name => name,
|
41
34
|
:public_key => key
|
42
35
|
}
|
43
|
-
|
36
|
+
begin
|
37
|
+
connection.servers.bootstrap(options)
|
38
|
+
rescue Fog::Compute::Rackspace::NotFound
|
39
|
+
raise "Sorry, it looks like there's no such Image Id as #{image_id}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def find_key
|
44
|
+
ssh_key = nil
|
45
|
+
['id_rsa.pub', 'id_dsa.pub', "#{SkewerConfig.instance.get(:key_name)}.pub"].each do |key|
|
46
|
+
key_path = File.expand_path(File.join(ENV['HOME'],'.ssh', key))
|
47
|
+
if File.exist?(key_path)
|
48
|
+
ssh_key = key_path
|
49
|
+
break
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
raise "Couldn't find a public key" unless ssh_key
|
54
|
+
File.read(ssh_key)
|
44
55
|
end
|
45
56
|
|
46
57
|
def destroy
|
47
|
-
@node.destroy
|
58
|
+
@node.destroy unless @node.nil?
|
48
59
|
end
|
49
60
|
|
50
61
|
def self.find_by_ip(ip_address, service = self.find_service())
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Skewer
|
2
|
+
module Rackspace
|
3
|
+
class Service
|
4
|
+
def initialize(short_region_name)
|
5
|
+
@region = region(short_region_name)
|
6
|
+
end
|
7
|
+
|
8
|
+
def region(short_region_name = nil)
|
9
|
+
short_region_name.to_s == 'lon' ? "lon.auth.api.rackspacecloud.com" :
|
10
|
+
"auth.api.rackspacecloud.com"
|
11
|
+
end
|
12
|
+
|
13
|
+
def build
|
14
|
+
Fog::Compute.new(
|
15
|
+
:provider => 'Rackspace',
|
16
|
+
:rackspace_api_key => Fog.credentials[:rackspace_api_key],
|
17
|
+
:rackspace_username => Fog.credentials[:rackspace_username],
|
18
|
+
:rackspace_auth_url => @region)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/skewer/version.rb
CHANGED
data/lib/source.rb
CHANGED
data/skewer.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.add_development_dependency 'metric_fu'
|
22
22
|
s.add_development_dependency 'rcov', '~> 1.0.0'
|
23
23
|
s.add_development_dependency 'rspec'
|
24
|
-
s.add_development_dependency 'vagrant'
|
24
|
+
s.add_development_dependency 'vagrant'
|
25
25
|
|
26
26
|
s.files = `git ls-files`.split("\n").reject {|path| path =~ /\.gitignore$/ }
|
27
27
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/spec/bootstrapper_spec.rb
CHANGED
@@ -106,7 +106,7 @@ describe Skewer::Bootstrapper do
|
|
106
106
|
|
107
107
|
it "should actually run the source step" do
|
108
108
|
node = stub('node')
|
109
|
-
node.should_receive(:username).at_least(
|
109
|
+
node.should_receive(:username).at_least(2).times
|
110
110
|
node.should_receive(:ssh)
|
111
111
|
bootstrapper = Skewer::Bootstrapper.new(node, {:role => 'foo'})
|
112
112
|
lambda {
|
data/spec/cuke_spec.rb
CHANGED
@@ -3,22 +3,11 @@ require 'cuke'
|
|
3
3
|
|
4
4
|
describe Skewer::Cuke do
|
5
5
|
it "should only accept valid directories for construction" do
|
6
|
-
lambda {
|
7
|
-
Skewer::Cuke.new(nil)
|
8
|
-
}.should raise_exception(RuntimeError, "you must provide a valid directory for features to be executed within")
|
9
|
-
|
10
|
-
lambda {
|
11
|
-
Skewer::Cuke.new(123)
|
12
|
-
}.should raise_exception(RuntimeError, "you must provide a valid directory for features to be executed within")
|
13
6
|
|
14
7
|
lambda {
|
15
8
|
Skewer::Cuke.new('')
|
16
9
|
}.should raise_exception(RuntimeError, "you must provide a valid directory for features to be executed within")
|
17
10
|
|
18
|
-
lambda {
|
19
|
-
Skewer::Cuke.new(123)
|
20
|
-
}.should raise_exception(RuntimeError, "you must provide a valid directory for features to be executed within")
|
21
|
-
|
22
11
|
lambda {
|
23
12
|
Skewer::Cuke.new('./spec/dir_that_doenst_exist')
|
24
13
|
}.should raise_exception(RuntimeError, "you must provide a valid directory for features to be executed within")
|
@@ -12,7 +12,7 @@ describe Skewer::Rackspace::Images do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should have a supported images hash associated with the hash" do
|
15
|
-
@images.
|
15
|
+
@images.distributions.class.should == Hash
|
16
16
|
end
|
17
17
|
|
18
18
|
it "should provide a default image ID if bad input provided" do
|
data/spec/rackspace/node_spec.rb
CHANGED
@@ -21,10 +21,9 @@ describe Skewer::Rackspace::Node do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should have a delete method" do
|
24
|
-
|
25
24
|
node = stub('node')
|
26
25
|
node.should_receive(:delete).and_return(true)
|
27
26
|
Skewer::Rackspace::Node.new(nil, nil, nil,node).node.delete.should == true
|
28
|
-
|
29
27
|
end
|
28
|
+
|
30
29
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "rspec"
|
2
|
+
require 'rackspace/service'
|
3
|
+
|
4
|
+
describe "Rackspace::Service" do
|
5
|
+
|
6
|
+
it "should return the london endpoint if you ask for lon" do
|
7
|
+
Skewer::Rackspace::Service.new(nil).region('lon').should == 'lon.auth.api.rackspacecloud.com'
|
8
|
+
Skewer::Rackspace::Service.new(nil).region(:lon).should == 'lon.auth.api.rackspacecloud.com'
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should default to the US endpoint" do
|
12
|
+
Skewer::Rackspace::Service.new(nil).region().should == 'auth.api.rackspacecloud.com'
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should even give you the US endpoint if something else leaks" do
|
16
|
+
Skewer::Rackspace::Service.new(nil).region('us-east-1').should == 'auth.api.rackspacecloud.com'
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/spec/source_spec.rb
CHANGED
@@ -18,7 +18,7 @@ describe Skewer::Source do
|
|
18
18
|
it "should make a parent directory to shut rsync up" do
|
19
19
|
node = mock('node')
|
20
20
|
node.should_receive(:dns_name).at_least(3).times.and_return('this.should.not.resolve')
|
21
|
-
node.should_receive(:username).at_least(
|
21
|
+
node.should_receive(:username).at_least(2).times.and_return('jimmy')
|
22
22
|
node.should_receive(:ssh)
|
23
23
|
source = Skewer::Source.new('/tmp/')
|
24
24
|
lambda { source.rsync(node) }.should raise_exception RuntimeError
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: skewer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Julian Simpson
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2012-
|
19
|
+
date: 2012-04-20 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: fog
|
@@ -112,14 +112,12 @@ dependencies:
|
|
112
112
|
requirement: &id007 !ruby/object:Gem::Requirement
|
113
113
|
none: false
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
hash:
|
117
|
+
hash: 3
|
118
118
|
segments:
|
119
119
|
- 0
|
120
|
-
|
121
|
-
- 0
|
122
|
-
version: 0.9.0
|
120
|
+
version: "0"
|
123
121
|
type: :development
|
124
122
|
version_requirements: *id007
|
125
123
|
description: Runs masterless puppet code on cloud machines
|
@@ -158,14 +156,20 @@ files:
|
|
158
156
|
- features/step_definitions/cucumber_steps.rb
|
159
157
|
- features/step_definitions/delete.rb
|
160
158
|
- features/support/env.rb
|
159
|
+
- features/support/puppetcode/manifests/classes/apache.pp
|
161
160
|
- features/support/puppetcode/manifests/classes/foobar.pp
|
162
161
|
- features/support/puppetcode/manifests/classes/foobroken.pp
|
163
162
|
- features/support/puppetcode/manifests/classes/role.pp
|
164
163
|
- features/support/puppetcode/manifests/site.pp
|
164
|
+
- features/support/puppetcode/modules/apache/manifests/install.pp
|
165
165
|
- features/support/puppetcode/modules/foo/manifests/bar.pp
|
166
166
|
- features/support/puppetcode/modules/foo/manifests/broken.pp
|
167
167
|
- features/support/puppetcode/modules/puppet/manifests/munge.pp
|
168
168
|
- features/update.feature
|
169
|
+
- hook-test/Gemfile
|
170
|
+
- hook-test/features/default_web_page.feature
|
171
|
+
- hook-test/features/step_definitions/steps.rb
|
172
|
+
- hook-test/features/support/env.rb
|
169
173
|
- lib/aws/node.rb
|
170
174
|
- lib/aws/security_group.rb
|
171
175
|
- lib/aws/service.rb
|
@@ -185,6 +189,7 @@ files:
|
|
185
189
|
- lib/puppet_runtime_error.rb
|
186
190
|
- lib/rackspace/images.rb
|
187
191
|
- lib/rackspace/node.rb
|
192
|
+
- lib/rackspace/service.rb
|
188
193
|
- lib/skewer.rb
|
189
194
|
- lib/skewer/version.rb
|
190
195
|
- lib/source.rb
|
@@ -207,6 +212,7 @@ files:
|
|
207
212
|
- spec/puppet_node_spec.rb
|
208
213
|
- spec/rackspace/images_spec.rb
|
209
214
|
- spec/rackspace/node_spec.rb
|
215
|
+
- spec/rackspace/service_spec.rb
|
210
216
|
- spec/source_spec.rb
|
211
217
|
- spec/spec_helper.rb
|
212
218
|
- spec/support/features/example.feature
|
@@ -244,7 +250,7 @@ rubyforge_project: skewer
|
|
244
250
|
rubygems_version: 1.8.17
|
245
251
|
signing_key:
|
246
252
|
specification_version: 3
|
247
|
-
summary: skewer-0.1.
|
253
|
+
summary: skewer-0.1.1
|
248
254
|
test_files:
|
249
255
|
- features/aws.feature
|
250
256
|
- features/bootstrapper.feature
|
@@ -257,10 +263,12 @@ test_files:
|
|
257
263
|
- features/step_definitions/cucumber_steps.rb
|
258
264
|
- features/step_definitions/delete.rb
|
259
265
|
- features/support/env.rb
|
266
|
+
- features/support/puppetcode/manifests/classes/apache.pp
|
260
267
|
- features/support/puppetcode/manifests/classes/foobar.pp
|
261
268
|
- features/support/puppetcode/manifests/classes/foobroken.pp
|
262
269
|
- features/support/puppetcode/manifests/classes/role.pp
|
263
270
|
- features/support/puppetcode/manifests/site.pp
|
271
|
+
- features/support/puppetcode/modules/apache/manifests/install.pp
|
264
272
|
- features/support/puppetcode/modules/foo/manifests/bar.pp
|
265
273
|
- features/support/puppetcode/modules/foo/manifests/broken.pp
|
266
274
|
- features/support/puppetcode/modules/puppet/manifests/munge.pp
|
@@ -281,6 +289,7 @@ test_files:
|
|
281
289
|
- spec/puppet_node_spec.rb
|
282
290
|
- spec/rackspace/images_spec.rb
|
283
291
|
- spec/rackspace/node_spec.rb
|
292
|
+
- spec/rackspace/service_spec.rb
|
284
293
|
- spec/source_spec.rb
|
285
294
|
- spec/spec_helper.rb
|
286
295
|
- spec/support/features/example.feature
|