spice 0.3.0 → 0.4.0
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.
- data/Gemfile.lock +43 -10
- data/README.md +5 -1
- data/lib/spice.rb +14 -5
- data/lib/spice/authentication.rb +4 -0
- data/lib/spice/connection.rb +6 -7
- data/lib/spice/version.rb +1 -1
- data/spec/spice/chef_spec.rb +11 -11
- data/spec/spice_spec.rb +26 -2
- data/spice.gemspec +3 -2
- metadata +19 -6
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
spice (0.
|
4
|
+
spice (0.4.0)
|
5
5
|
mixlib-authentication
|
6
6
|
rest-client
|
7
7
|
yajl-ruby
|
@@ -9,8 +9,24 @@ PATH
|
|
9
9
|
GEM
|
10
10
|
remote: http://rubygems.org/
|
11
11
|
specs:
|
12
|
+
abstract (1.0.0)
|
12
13
|
addressable (2.2.2)
|
13
14
|
builder (3.0.0)
|
15
|
+
bunny (0.6.0)
|
16
|
+
chef (0.9.12)
|
17
|
+
bunny (>= 0.6.0)
|
18
|
+
erubis
|
19
|
+
extlib
|
20
|
+
highline
|
21
|
+
json (>= 1.4.4, <= 1.4.6)
|
22
|
+
mixlib-authentication (>= 1.1.0)
|
23
|
+
mixlib-cli (>= 1.1.0)
|
24
|
+
mixlib-config (>= 1.1.2)
|
25
|
+
mixlib-log (>= 1.2.0)
|
26
|
+
moneta
|
27
|
+
ohai (>= 0.5.7)
|
28
|
+
rest-client (>= 1.0.4, < 1.7.0)
|
29
|
+
uuidtools
|
14
30
|
crack (0.1.8)
|
15
31
|
cucumber (0.10.0)
|
16
32
|
builder (>= 2.1.2)
|
@@ -19,40 +35,57 @@ GEM
|
|
19
35
|
json (~> 1.4.6)
|
20
36
|
term-ansicolor (~> 1.0.5)
|
21
37
|
diff-lcs (1.1.2)
|
38
|
+
erubis (2.6.6)
|
39
|
+
abstract (>= 1.0.0)
|
40
|
+
extlib (0.9.15)
|
22
41
|
gherkin (2.3.2)
|
23
42
|
json (~> 1.4.6)
|
24
43
|
term-ansicolor (~> 1.0.5)
|
44
|
+
highline (1.6.1)
|
25
45
|
json (1.4.6)
|
26
46
|
mime-types (1.16)
|
27
47
|
mixlib-authentication (1.1.4)
|
28
48
|
mixlib-log
|
49
|
+
mixlib-cli (1.2.0)
|
50
|
+
mixlib-config (1.1.2)
|
29
51
|
mixlib-log (1.2.0)
|
52
|
+
moneta (0.6.0)
|
53
|
+
ohai (0.5.8)
|
54
|
+
extlib
|
55
|
+
json (>= 1.4.4, <= 1.4.6)
|
56
|
+
mixlib-cli
|
57
|
+
mixlib-config
|
58
|
+
mixlib-log
|
59
|
+
systemu
|
30
60
|
rcov (0.9.9)
|
31
61
|
rest-client (1.6.1)
|
32
62
|
mime-types (>= 1.16)
|
33
|
-
rspec (2.
|
34
|
-
rspec-core (~> 2.
|
35
|
-
rspec-expectations (~> 2.
|
36
|
-
rspec-mocks (~> 2.
|
37
|
-
rspec-core (2.
|
38
|
-
rspec-expectations (2.
|
63
|
+
rspec (2.5.0)
|
64
|
+
rspec-core (~> 2.5.0)
|
65
|
+
rspec-expectations (~> 2.5.0)
|
66
|
+
rspec-mocks (~> 2.5.0)
|
67
|
+
rspec-core (2.5.1)
|
68
|
+
rspec-expectations (2.5.0)
|
39
69
|
diff-lcs (~> 1.1.2)
|
40
|
-
rspec-mocks (2.
|
70
|
+
rspec-mocks (2.5.0)
|
71
|
+
systemu (1.2.0)
|
41
72
|
term-ansicolor (1.0.5)
|
42
73
|
timecop (0.3.5)
|
74
|
+
uuidtools (2.1.1)
|
43
75
|
webmock (1.6.1)
|
44
76
|
addressable (>= 2.2.2)
|
45
77
|
crack (>= 0.1.7)
|
46
|
-
yajl-ruby (0.
|
78
|
+
yajl-ruby (0.8.1)
|
47
79
|
yard (0.6.4)
|
48
80
|
|
49
81
|
PLATFORMS
|
50
82
|
ruby
|
51
83
|
|
52
84
|
DEPENDENCIES
|
85
|
+
chef
|
53
86
|
cucumber (~> 0.10.0)
|
54
87
|
rcov
|
55
|
-
rspec (~> 2.
|
88
|
+
rspec (~> 2.5.0)
|
56
89
|
spice!
|
57
90
|
timecop (~> 0.3.5)
|
58
91
|
webmock (~> 1.6.1)
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# spice
|
2
2
|
|
3
|
-
Spice is a zesty Chef API wrapper.
|
3
|
+
Spice is a zesty Chef API wrapper. Its primary purpose is to let you easily integrate your apps with a (Chef)[http://opscode.com/chef] server easily. Spice provides support for the [Chef API](http://wiki.opscode.com/display/chef/Server+API)
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -81,6 +81,10 @@ Scope out [the official Chef API docs](http://wiki.opscode.com/display/chef/Serv
|
|
81
81
|
TODO
|
82
82
|
|
83
83
|
|
84
|
+
### Contributors
|
85
|
+
|
86
|
+
* Ian Meyer (https://github.com/imeyer), added Opscode Platform support
|
87
|
+
|
84
88
|
## Contributing to spice
|
85
89
|
|
86
90
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
data/lib/spice.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require 'bundler'
|
2
|
-
Bundler.require
|
3
|
-
|
4
1
|
require 'rest-client'
|
2
|
+
require 'mixlib/authentication'
|
3
|
+
require 'yajl'
|
4
|
+
|
5
5
|
require 'spice/authentication'
|
6
6
|
require 'spice/chef'
|
7
7
|
require 'spice/role'
|
@@ -12,12 +12,13 @@ require 'spice/data_bag'
|
|
12
12
|
require 'spice/node'
|
13
13
|
require 'spice/connection'
|
14
14
|
|
15
|
+
require 'spice/version'
|
15
16
|
require 'spice/mock'
|
16
17
|
|
17
18
|
module Spice
|
18
19
|
|
19
20
|
class << self
|
20
|
-
attr_writer :host, :port, :scheme, :client_name, :connection, :key_file, :raw_key
|
21
|
+
attr_writer :host, :port, :scheme, :url_path, :client_name, :connection, :key_file, :raw_key
|
21
22
|
|
22
23
|
def default_host
|
23
24
|
@default_host || "localhost"
|
@@ -31,6 +32,10 @@ module Spice
|
|
31
32
|
@default_scheme || "http"
|
32
33
|
end
|
33
34
|
|
35
|
+
def default_url_path
|
36
|
+
@default_url_path || ""
|
37
|
+
end
|
38
|
+
|
34
39
|
def host
|
35
40
|
@host || default_host
|
36
41
|
end
|
@@ -62,6 +67,11 @@ module Spice
|
|
62
67
|
@raw_key = raw_key
|
63
68
|
end
|
64
69
|
|
70
|
+
|
71
|
+
def url_path
|
72
|
+
@url_path || default_url_path
|
73
|
+
end
|
74
|
+
|
65
75
|
def connection
|
66
76
|
@connection
|
67
77
|
end
|
@@ -82,7 +92,6 @@ module Spice
|
|
82
92
|
@key_file = nil
|
83
93
|
@client_name = nil
|
84
94
|
@connection = nil
|
85
|
-
puts "Spice is reset"
|
86
95
|
end
|
87
96
|
|
88
97
|
def setup
|
data/lib/spice/authentication.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'openssl'
|
2
2
|
require 'mixlib/authentication/signedheaderauth'
|
3
|
+
require 'chef/version'
|
3
4
|
|
4
5
|
module Spice
|
5
6
|
class Authentication
|
@@ -23,6 +24,9 @@ module Spice
|
|
23
24
|
sign_obj = Mixlib::Authentication::SignedHeaderAuth.signing_object(request_params)
|
24
25
|
signed = sign_obj.sign(key).merge({:host => host})
|
25
26
|
signed.inject({}){|memo, kv| memo["#{kv[0].to_s.upcase}"] = kv[1];memo}
|
27
|
+
# Platform requires X-Chef-Version header
|
28
|
+
version = { "X-Chef-Version" => ::Chef::VERSION }
|
29
|
+
signed.merge!(version)
|
26
30
|
end
|
27
31
|
|
28
32
|
private
|
data/lib/spice/connection.rb
CHANGED
@@ -10,8 +10,7 @@ module Spice
|
|
10
10
|
@host = endpoint.host
|
11
11
|
@scheme = endpoint.scheme
|
12
12
|
@port = endpoint.port
|
13
|
-
@
|
14
|
-
@path = URI.parse(@url).path
|
13
|
+
@url_path = endpoint.path
|
15
14
|
@auth_credentials = Authentication.new(options[:client_name], options[:key_file])
|
16
15
|
@sign_on_redirect, @sign_request = true, true
|
17
16
|
end
|
@@ -20,7 +19,7 @@ module Spice
|
|
20
19
|
begin
|
21
20
|
RestClient.get(
|
22
21
|
"#{@url}#{path}",
|
23
|
-
build_headers(:GET, path, headers)
|
22
|
+
build_headers(:GET, "#{@url_path}#{path}", headers)
|
24
23
|
)
|
25
24
|
rescue => e
|
26
25
|
e.response
|
@@ -32,7 +31,7 @@ module Spice
|
|
32
31
|
RestClient.post(
|
33
32
|
"#{@url}#{path}",
|
34
33
|
JSON.generate(payload),
|
35
|
-
build_headers(:POST, path, headers, JSON.generate(payload))
|
34
|
+
build_headers(:POST, "#{@url_path}#{path}", headers, JSON.generate(payload))
|
36
35
|
)
|
37
36
|
rescue => e
|
38
37
|
e.response
|
@@ -44,7 +43,7 @@ module Spice
|
|
44
43
|
RestClient.put(
|
45
44
|
"#{@url}#{path}",
|
46
45
|
JSON.generate(payload),
|
47
|
-
build_headers(:PUT, path, headers, JSON.generate(payload))
|
46
|
+
build_headers(:PUT, "#{@url_path}#{path}", headers, JSON.generate(payload))
|
48
47
|
)
|
49
48
|
rescue => e
|
50
49
|
e.response
|
@@ -55,7 +54,7 @@ module Spice
|
|
55
54
|
begin
|
56
55
|
RestClient.delete(
|
57
56
|
"#{@url}#{path}",
|
58
|
-
build_headers(:DELETE, path, headers)
|
57
|
+
build_headers(:DELETE, "#{@url_path}#{path}", headers)
|
59
58
|
)
|
60
59
|
rescue => e
|
61
60
|
e.response
|
@@ -73,7 +72,7 @@ module Spice
|
|
73
72
|
:http_method => method,
|
74
73
|
:path => path,
|
75
74
|
:body => json_body,
|
76
|
-
:host => "#{@
|
75
|
+
:host => "#{@host}:#{@port}"
|
77
76
|
}
|
78
77
|
request_params[:body] ||= ""
|
79
78
|
auth_credentials.signature_headers(request_params)
|
data/lib/spice/version.rb
CHANGED
data/spec/spice/chef_spec.rb
CHANGED
@@ -21,10 +21,10 @@ module Spice
|
|
21
21
|
:headers => {})
|
22
22
|
end
|
23
23
|
it "should return a list of all clients" do
|
24
|
-
clients.length.should == 2
|
24
|
+
JSON.parse(clients).length.should == 2
|
25
25
|
end
|
26
26
|
it "should provide valid client" do
|
27
|
-
clients["testclient"].should == "
|
27
|
+
clients["testclient"].should == "testclient"
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -40,11 +40,11 @@ module Spice
|
|
40
40
|
)
|
41
41
|
end
|
42
42
|
it "should return a list of all nodes" do
|
43
|
-
nodes.length.should == 1
|
43
|
+
JSON.parse(nodes).length.should == 1
|
44
44
|
# nodes.first["testnode"].should == "http://localhost:4000/nodes/testnode"
|
45
45
|
end
|
46
46
|
it "should provide valid node" do
|
47
|
-
nodes["testnode"].should == "
|
47
|
+
nodes["testnode"].should == "testnode"
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -59,10 +59,10 @@ module Spice
|
|
59
59
|
)
|
60
60
|
end
|
61
61
|
it "should return a list of all data bags" do
|
62
|
-
data_bags.length.should == 1
|
62
|
+
JSON.parse(data_bags).length.should == 1
|
63
63
|
end
|
64
64
|
it "should provide valid data" do
|
65
|
-
data_bags["testdata"].should == "
|
65
|
+
data_bags["testdata"].should == "testdata"
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
@@ -72,15 +72,15 @@ module Spice
|
|
72
72
|
stub_request(:get, "http://localhost:4000/roles").
|
73
73
|
to_return(
|
74
74
|
:status => 200,
|
75
|
-
:body => '{"testrole":"
|
75
|
+
:body => '{"testrole":"testrole"}',
|
76
76
|
:headers => {}
|
77
77
|
)
|
78
78
|
end
|
79
79
|
it "should return a list of all roles" do
|
80
|
-
roles.length.should == 1
|
80
|
+
JSON.parse(roles).length.should == 1
|
81
81
|
end
|
82
82
|
it "should provide valid role" do
|
83
|
-
roles["testrole"].should == "
|
83
|
+
roles["testrole"].should == "testrole"
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
@@ -95,10 +95,10 @@ module Spice
|
|
95
95
|
)
|
96
96
|
end
|
97
97
|
it "should return a list of all cookbooks" do
|
98
|
-
cookbooks.length.should == 1
|
98
|
+
JSON.parse(cookbooks).length.should == 1
|
99
99
|
end
|
100
100
|
it "should provide valid cookbook" do
|
101
|
-
cookbooks["testcookbook"].should == "
|
101
|
+
cookbooks["testcookbook"].should == "testcookbook"
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|
data/spec/spice_spec.rb
CHANGED
@@ -28,7 +28,16 @@ describe "Spice" do
|
|
28
28
|
lambda { Spice.default_scheme = "ftp" }.should raise_error
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
|
+
describe ".default_url_path" do
|
33
|
+
it "should default to ''" do
|
34
|
+
Spice.default_url_path.should == ""
|
35
|
+
end
|
36
|
+
it "should not be settable" do
|
37
|
+
lambda { Spice.default_url_path = "/woohah" }.should raise_error
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
32
41
|
describe ".host" do
|
33
42
|
it "should default to 'localhost' if not set" do
|
34
43
|
Spice.host.should == "localhost"
|
@@ -59,7 +68,18 @@ describe "Spice" do
|
|
59
68
|
end
|
60
69
|
end
|
61
70
|
|
71
|
+
describe ".url_path" do
|
72
|
+
it "should default to '' if not set" do
|
73
|
+
Spice.url_path.should == ""
|
74
|
+
end
|
75
|
+
it "should be settable" do
|
76
|
+
Spice.url_path = "/woohah"
|
77
|
+
Spice.url_path.should == "/woohah"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
62
81
|
describe ".client_name" do
|
82
|
+
before { Spice.reset! }
|
63
83
|
it "should not have a default" do
|
64
84
|
Spice.client_name.should be_nil
|
65
85
|
end
|
@@ -70,12 +90,14 @@ describe "Spice" do
|
|
70
90
|
end
|
71
91
|
|
72
92
|
describe ".key_file" do
|
93
|
+
before { Spice.reset! }
|
94
|
+
|
73
95
|
it "should not have a default" do
|
74
96
|
Spice.key_file.should be_nil
|
75
97
|
end
|
76
98
|
it "should be settable" do
|
77
99
|
Spice.key_file = "/tmp/keyfile.pem"
|
78
|
-
Spice.key_file.should ==
|
100
|
+
Spice.key_file.should == "/tmp/keyfile.pem"
|
79
101
|
end
|
80
102
|
it "should raise exception if it does not exist" do
|
81
103
|
lambda { Spice.key_file = "/tmp/badkey.pem" }.should raise_error(Errno::ENOENT)
|
@@ -83,6 +105,8 @@ describe "Spice" do
|
|
83
105
|
end
|
84
106
|
|
85
107
|
describe ".connection" do
|
108
|
+
before { Spice.reset! }
|
109
|
+
|
86
110
|
it "should not have a default" do
|
87
111
|
Spice.connection.should be_nil
|
88
112
|
end
|
data/spice.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.email = ["hi@iamdanryan.com"]
|
11
11
|
s.homepage = "http://github.com/danryan/spice"
|
12
12
|
s.summary = %q{Chef API wrapper}
|
13
|
-
s.description = %q{Spice is a zesty Chef API wrapper. It's primary purpose is to let you easily integrate your apps with a
|
13
|
+
s.description = %q{Spice is a zesty Chef API wrapper. It's primary purpose is to let you easily integrate your apps with a Chef server easily. Spice provides support for the entire released Chef API}
|
14
14
|
|
15
15
|
s.rubyforge_project = "spice"
|
16
16
|
|
@@ -19,11 +19,12 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.add_dependency "yajl-ruby"
|
20
20
|
|
21
21
|
s.add_development_dependency "yard", "~> 0.6.4"
|
22
|
-
s.add_development_dependency "rspec", "~> 2.
|
22
|
+
s.add_development_dependency "rspec", "~> 2.5.0"
|
23
23
|
s.add_development_dependency "cucumber", "~> 0.10.0"
|
24
24
|
s.add_development_dependency "webmock", "~> 1.6.1"
|
25
25
|
s.add_development_dependency "timecop", "~> 0.3.5"
|
26
26
|
s.add_development_dependency "rcov"
|
27
|
+
s.add_development_dependency "chef"
|
27
28
|
|
28
29
|
s.files = `git ls-files`.split("\n")
|
29
30
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 4
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.4.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Dan Ryan
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-02-27 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -81,9 +81,9 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
segments:
|
83
83
|
- 2
|
84
|
-
-
|
84
|
+
- 5
|
85
85
|
- 0
|
86
|
-
version: 2.
|
86
|
+
version: 2.5.0
|
87
87
|
type: :development
|
88
88
|
version_requirements: *id005
|
89
89
|
- !ruby/object:Gem::Dependency
|
@@ -144,7 +144,20 @@ dependencies:
|
|
144
144
|
version: "0"
|
145
145
|
type: :development
|
146
146
|
version_requirements: *id009
|
147
|
-
|
147
|
+
- !ruby/object:Gem::Dependency
|
148
|
+
name: chef
|
149
|
+
prerelease: false
|
150
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
151
|
+
none: false
|
152
|
+
requirements:
|
153
|
+
- - ">="
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
segments:
|
156
|
+
- 0
|
157
|
+
version: "0"
|
158
|
+
type: :development
|
159
|
+
version_requirements: *id010
|
160
|
+
description: Spice is a zesty Chef API wrapper. It's primary purpose is to let you easily integrate your apps with a Chef server easily. Spice provides support for the entire released Chef API
|
148
161
|
email:
|
149
162
|
- hi@iamdanryan.com
|
150
163
|
executables: []
|