spice 0.0.1.alpha.2 → 0.0.2.beta
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile.lock +64 -2
- data/README.md +83 -4
- data/Rakefile +19 -0
- data/TODO.md +2 -0
- data/features/support/env.rb +1 -0
- data/file.txt +0 -0
- data/lib/spice.rb +87 -2
- data/lib/spice/authentication.rb +1 -1
- data/lib/spice/chef.rb +34 -30
- data/lib/spice/client.rb +1 -1
- data/lib/spice/connection.rb +4 -5
- data/lib/spice/cookbook.rb +2 -2
- data/lib/spice/data_bag.rb +1 -1
- data/lib/spice/node.rb +1 -1
- data/lib/spice/role.rb +30 -0
- data/lib/spice/version.rb +1 -1
- data/spec/spec_helper.rb +13 -3
- data/spec/spice/authentication_spec.rb +0 -0
- data/spec/spice/chef_spec.rb +105 -0
- data/spec/spice/client_spec.rb +69 -0
- data/spec/spice/connection_spec.rb +0 -0
- data/spec/spice/cookbook_spec.rb +35 -0
- data/spec/spice/data_bag_spec.rb +35 -0
- data/spec/spice/node_spec.rb +35 -0
- data/spec/spice/role_spec.rb +35 -0
- data/spec/spice_spec.rb +124 -2
- data/spec/support/authentication.rb +42 -0
- data/spec/support/headers.rb +18 -0
- data/spec/support/vcr.rb +8 -0
- data/spice.gemspec +10 -2
- metadata +149 -7
data/lib/spice/cookbook.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spice
|
2
2
|
class Cookbook < Spice::Chef
|
3
3
|
def self.all(options={})
|
4
|
-
connection.get("/cookbooks")
|
4
|
+
connection.get("/cookbooks")
|
5
5
|
end
|
6
6
|
|
7
7
|
def self.[](name)
|
@@ -24,7 +24,7 @@ module Spice
|
|
24
24
|
|
25
25
|
def self.delete(options={})
|
26
26
|
name = options.delete(:name)
|
27
|
-
connection.delete("/cookbooks/#{name}")
|
27
|
+
connection.delete("/cookbooks/#{name}", options)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
data/lib/spice/data_bag.rb
CHANGED
data/lib/spice/node.rb
CHANGED
data/lib/spice/role.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Spice
|
2
|
+
class Role < Spice::Chef
|
3
|
+
def self.all(options={})
|
4
|
+
connection.get("/roles")
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.[](name)
|
8
|
+
connection.get("/roles/#{name}")
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.show(options={})
|
12
|
+
name = options.delete(:name)
|
13
|
+
connection.get("/roles/#{name}")
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.create(options={})
|
17
|
+
connection.post("/roles", options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.update(options={})
|
21
|
+
name = options.delete(:name)
|
22
|
+
connection.put("/roles/#{name}", options)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.delete(options={})
|
26
|
+
name = options.delete(:name)
|
27
|
+
connection.delete("/roles/#{name}", options)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/spice/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,14 +1,24 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
2
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
require 'bundler'
|
4
|
+
Bundler.require
|
5
|
+
|
3
6
|
require 'rspec'
|
7
|
+
require 'webmock/rspec'
|
8
|
+
require 'timecop'
|
9
|
+
require 'forgery'
|
4
10
|
require 'spice'
|
11
|
+
require 'chef'
|
5
12
|
|
6
|
-
require 'rest-client'
|
7
|
-
require 'mixlib-authentication'
|
8
13
|
# Requires supporting files with custom matchers and macros, etc,
|
9
14
|
# in ./support/ and its subdirectories.
|
10
15
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
11
16
|
|
12
17
|
RSpec.configure do |config|
|
13
|
-
|
18
|
+
config.before do
|
19
|
+
Timecop.freeze
|
20
|
+
end
|
21
|
+
config.after do
|
22
|
+
Timecop.return
|
23
|
+
end
|
14
24
|
end
|
File without changes
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spice
|
4
|
+
describe Chef do
|
5
|
+
describe '.connection' do
|
6
|
+
before { setup_chef_client }
|
7
|
+
it "returns an instance of Spice::Connection" do
|
8
|
+
Spice::Chef.connection.should be_an_instance_of(Spice::Connection)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '.clients' do
|
13
|
+
let(:clients) { Chef.clients }
|
14
|
+
|
15
|
+
before do
|
16
|
+
stub_request(:get, "http://localhost:4000/clients").
|
17
|
+
to_return(
|
18
|
+
:status => 200,
|
19
|
+
:body => '{"testclient":"http://localhost:4000/clients/testclient",
|
20
|
+
"goodclient":"http://localhost:4000/clients/goodclient"}',
|
21
|
+
:headers => {})
|
22
|
+
end
|
23
|
+
it "should return a list of all clients" do
|
24
|
+
clients.length.should == 2
|
25
|
+
end
|
26
|
+
it "should provide valid client" do
|
27
|
+
clients["testclient"].should == "http://localhost:4000/clients/testclient"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '.nodes' do
|
32
|
+
let(:nodes) { Chef.nodes }
|
33
|
+
|
34
|
+
before do
|
35
|
+
stub_request(:get, "http://localhost:4000/nodes").
|
36
|
+
to_return(
|
37
|
+
:status => 200,
|
38
|
+
:body => '{"testnode":"http://localhost:4000/nodes/testnode"}',
|
39
|
+
:headers => {}
|
40
|
+
)
|
41
|
+
end
|
42
|
+
it "should return a list of all nodes" do
|
43
|
+
nodes.length.should == 1
|
44
|
+
# nodes.first["testnode"].should == "http://localhost:4000/nodes/testnode"
|
45
|
+
end
|
46
|
+
it "should provide valid node" do
|
47
|
+
nodes["testnode"].should == "http://localhost:4000/nodes/testnode"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '.data_bags' do
|
52
|
+
let(:data_bags) { Chef.data_bags }
|
53
|
+
before do
|
54
|
+
stub_request(:get, "http://localhost:4000/data").
|
55
|
+
to_return(
|
56
|
+
:status => 200,
|
57
|
+
:body => '{"testdata":"http://localhost:4000/data/testdata"}',
|
58
|
+
:headers => {}
|
59
|
+
)
|
60
|
+
end
|
61
|
+
it "should return a list of all data bags" do
|
62
|
+
data_bags.length.should == 1
|
63
|
+
end
|
64
|
+
it "should provide valid data" do
|
65
|
+
data_bags["testdata"].should == "http://localhost:4000/data/testdata"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '.roles' do
|
70
|
+
let(:roles) { Chef.roles }
|
71
|
+
before do
|
72
|
+
stub_request(:get, "http://localhost:4000/roles").
|
73
|
+
to_return(
|
74
|
+
:status => 200,
|
75
|
+
:body => '{"testrole":"http://localhost:4000/roles/testrole"}',
|
76
|
+
:headers => {}
|
77
|
+
)
|
78
|
+
end
|
79
|
+
it "should return a list of all roles" do
|
80
|
+
roles.length.should == 1
|
81
|
+
end
|
82
|
+
it "should provide valid role" do
|
83
|
+
roles["testrole"].should == "http://localhost:4000/roles/testrole"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '.cookbooks' do
|
88
|
+
let(:cookbooks) { Chef.cookbooks }
|
89
|
+
before do
|
90
|
+
stub_request(:get, "http://localhost:4000/cookbooks").
|
91
|
+
to_return(
|
92
|
+
:status => 200,
|
93
|
+
:body => '{"testcookbook":"http://localhost:4000/cookbooks/testcookbook"}',
|
94
|
+
:headers => {}
|
95
|
+
)
|
96
|
+
end
|
97
|
+
it "should return a list of all cookbooks" do
|
98
|
+
cookbooks.length.should == 1
|
99
|
+
end
|
100
|
+
it "should provide valid cookbook" do
|
101
|
+
cookbooks["testcookbook"].should == "http://localhost:4000/cookbooks/testcookbook"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spice
|
4
|
+
describe Client do
|
5
|
+
describe ".list" do
|
6
|
+
# setup_authentication
|
7
|
+
let(:chef) { setup_chef_client }
|
8
|
+
it "returns a list of clients" do
|
9
|
+
VCR.use_cassette 'client/list', :record => :new_episodes do
|
10
|
+
# chef.get_rest("/clients")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe ".show" do
|
16
|
+
# VCR.use_cassette 'client/show', :record => :new_episodes do
|
17
|
+
# Client.show(:name => "testclient")
|
18
|
+
# end
|
19
|
+
let(:chef) { setup_chef_client }
|
20
|
+
it "returns a valid client" do
|
21
|
+
VCR.use_cassette 'client/show', :record => :new_episodes do
|
22
|
+
# chef.get_rest("/clients/admin")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
it "returns nothing when a client is not found" do
|
26
|
+
VCR.use_cassette 'client/show_not_found', :record => :new_episodes do
|
27
|
+
# chef.get_rest("/clients/badclient")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ".create" do
|
33
|
+
let(:chef) { setup_chef_client }
|
34
|
+
it "creates a valid non-admin client" do
|
35
|
+
VCR.use_cassette 'client/create_nonadmin', :record => :new_episodes do
|
36
|
+
# chef.post_rest("/clients", JSON.generate(:name => "lkjasdf", :admin => false))
|
37
|
+
Client.create(:name => "kijasf", :admin => false)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
# it "creates a valid admin client" do
|
41
|
+
# VCR.use_cassette 'client/create', :record => :new_episodes do
|
42
|
+
# chef.post_rest("/clients", JSON.parse(:name => "testclient", :admin => true))
|
43
|
+
# end
|
44
|
+
# end
|
45
|
+
it "does not create a client that already exists"
|
46
|
+
end
|
47
|
+
#
|
48
|
+
# describe ".update" do
|
49
|
+
# setup_authentication
|
50
|
+
#
|
51
|
+
# let(:name) { Forgery::Name.first_name.downcase.to_s }
|
52
|
+
# before { Client.create(:name => name) }
|
53
|
+
# VCR.use_cassette 'client/update', :record => :new_episodes do
|
54
|
+
# Client.update(:name => "name")
|
55
|
+
# end
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# describe ".delete" do
|
59
|
+
# setup_authentication
|
60
|
+
#
|
61
|
+
# let(:name) { Forgery::Name.first_name.downcase.to_s }
|
62
|
+
# before { Client.create(:name => name) }
|
63
|
+
#
|
64
|
+
# VCR.use_cassette 'client/delete', :record => :new_episodes do
|
65
|
+
# Client.delete(:name => name)
|
66
|
+
# end
|
67
|
+
# end
|
68
|
+
end
|
69
|
+
end
|
File without changes
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spice
|
4
|
+
describe Cookbook do
|
5
|
+
describe ".list" do
|
6
|
+
VCR.use_cassette 'cookbook/list', :record => :new_episodes do
|
7
|
+
Cookbook.list
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe ".show" do
|
12
|
+
VCR.use_cassette 'cookbook/show', :record => :new_episodes do
|
13
|
+
Cookbook.show(:name => "testcookbook")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ".create" do
|
18
|
+
VCR.use_cassette 'cookbook/create', :record => :new_episodes do
|
19
|
+
Cookbook.create(:name => "testcookbook")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe ".update" do
|
24
|
+
VCR.use_cassette 'cookbook/update', :record => :new_episodes do
|
25
|
+
Cookbook.update(:name => "testcookbook")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe ".delete" do
|
30
|
+
VCR.use_cassette 'cookbook/delete', :record => :new_episodes do
|
31
|
+
Cookbook.delete(:name => "testcookbook")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spice
|
4
|
+
describe DataBag do
|
5
|
+
describe ".list" do
|
6
|
+
VCR.use_cassette 'data/list', :record => :new_episodes do
|
7
|
+
DataBag.list
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe ".show" do
|
12
|
+
VCR.use_cassette 'data/show', :record => :new_episodes do
|
13
|
+
DataBag.show(:name => "testdata")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ".create" do
|
18
|
+
VCR.use_cassette 'data/create', :record => :new_episodes do
|
19
|
+
DataBag.create(:name => "testdata")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe ".update" do
|
24
|
+
VCR.use_cassette 'data/update', :record => :new_episodes do
|
25
|
+
DataBag.update(:name => "testdata")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe ".delete" do
|
30
|
+
VCR.use_cassette 'data/delete', :record => :new_episodes do
|
31
|
+
DataBag.delete(:name => "testdata")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spice
|
4
|
+
describe Node do
|
5
|
+
describe ".list" do
|
6
|
+
VCR.use_cassette 'node/list', :record => :new_episodes do
|
7
|
+
Node.list
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe ".show" do
|
12
|
+
VCR.use_cassette 'node/show', :record => :new_episodes do
|
13
|
+
Node.show(:name => "testnode")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ".create" do
|
18
|
+
VCR.use_cassette 'node/create', :record => :new_episodes do
|
19
|
+
Node.create(:name => "testnode")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe ".update" do
|
24
|
+
VCR.use_cassette 'node/update', :record => :new_episodes do
|
25
|
+
Node.update(:name => "testnode")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe ".delete" do
|
30
|
+
VCR.use_cassette 'node/delete', :record => :new_episodes do
|
31
|
+
Node.delete(:name => "testnode")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spice
|
4
|
+
describe Role do
|
5
|
+
describe ".list" do
|
6
|
+
VCR.use_cassette 'role/list', :record => :new_episodes do
|
7
|
+
Role.list
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe ".show" do
|
12
|
+
VCR.use_cassette 'role/show', :record => :new_episodes do
|
13
|
+
Role.show(:name => "testrole")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ".create" do
|
18
|
+
VCR.use_cassette 'role/create', :record => :new_episodes do
|
19
|
+
Role.create(:name => "testrole")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe ".update" do
|
24
|
+
VCR.use_cassette 'role/update', :record => :new_episodes do
|
25
|
+
Role.update(:name => "testrole")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe ".delete" do
|
30
|
+
VCR.use_cassette 'role/delete', :record => :new_episodes do
|
31
|
+
Role.delete(:name => "testrole")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/spec/spice_spec.rb
CHANGED
@@ -1,7 +1,129 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe "Spice" do
|
4
|
-
|
5
|
-
|
4
|
+
describe ".default_host" do
|
5
|
+
it "should default to 'localhost'" do
|
6
|
+
Spice.default_host.should == "localhost"
|
7
|
+
end
|
8
|
+
it "should not be settable" do
|
9
|
+
lambda { Spice.default_host = "chef.example.com" }.should raise_error
|
10
|
+
end
|
11
|
+
# @default_host || "localhost"
|
12
|
+
end
|
13
|
+
|
14
|
+
describe ".default_port" do
|
15
|
+
it "should default to '4000'" do
|
16
|
+
Spice.default_port.should == "4000"
|
17
|
+
end
|
18
|
+
it "should not be settable" do
|
19
|
+
lambda { Spice.default_port = "9000" }.should raise_error
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe ".default_scheme" do
|
24
|
+
it "should default to 'http'" do
|
25
|
+
Spice.default_scheme.should == "http"
|
26
|
+
end
|
27
|
+
it "should not be settable" do
|
28
|
+
lambda { Spice.default_scheme = "ftp" }.should raise_error
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ".host" do
|
33
|
+
it "should default to 'localhost' if not set" do
|
34
|
+
Spice.host.should == "localhost"
|
35
|
+
end
|
36
|
+
it "should be settable" do
|
37
|
+
Spice.host = "chef.example.com"
|
38
|
+
Spice.host.should == "chef.example.com"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe ".port" do
|
43
|
+
it "should default to '4000' if not set" do
|
44
|
+
Spice.port.should == "4000"
|
45
|
+
end
|
46
|
+
it "should be settable" do
|
47
|
+
Spice.port = "9000"
|
48
|
+
Spice.port.should == "9000"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe ".scheme" do
|
53
|
+
it "should default to 'http' if not set" do
|
54
|
+
Spice.scheme.should == "http"
|
55
|
+
end
|
56
|
+
it "should be settable" do
|
57
|
+
Spice.scheme = 'https'
|
58
|
+
Spice.scheme.should == 'https'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe ".client_name" do
|
63
|
+
it "should not have a default" do
|
64
|
+
Spice.client_name.should be_nil
|
65
|
+
end
|
66
|
+
it "should be settable" do
|
67
|
+
Spice.client_name = "testclient"
|
68
|
+
Spice.client_name.should == "testclient"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe ".key_file" do
|
73
|
+
it "should not have a default" do
|
74
|
+
Spice.key_file.should be_nil
|
75
|
+
end
|
76
|
+
it "should be settable" do
|
77
|
+
Spice.key_file = "/tmp/keyfile.pem"
|
78
|
+
Spice.key_file.should == File.read("/tmp/keyfile.pem")
|
79
|
+
end
|
80
|
+
it "should raise exception if it does not exist" do
|
81
|
+
lambda { Spice.key_file = "/tmp/badkey.pem" }.should raise_error(Errno::ENOENT)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe ".connection" do
|
86
|
+
it "should not have a default" do
|
87
|
+
Spice.connection.should be_nil
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe ".reset!" do
|
92
|
+
before do
|
93
|
+
Spice.host = "chef.example.com"
|
94
|
+
Spice.port = "9000"
|
95
|
+
Spice.scheme = "https"
|
96
|
+
Spice.key_file = "/tmp/keyfile.pem"
|
97
|
+
Spice.client_name = "testduder"
|
98
|
+
end
|
99
|
+
it "should reset Spice.host" do
|
100
|
+
Spice.reset!
|
101
|
+
Spice.host.should == "localhost"
|
102
|
+
end
|
103
|
+
it "should reset Spice.port" do
|
104
|
+
Spice.reset!
|
105
|
+
Spice.port.should == "4000"
|
106
|
+
end
|
107
|
+
it "should reset Spice.scheme" do
|
108
|
+
Spice.reset!
|
109
|
+
Spice.scheme.should == "http"
|
110
|
+
end
|
111
|
+
it "should unset Spice.key_file" do
|
112
|
+
Spice.reset!
|
113
|
+
Spice.key_file.should be_nil
|
114
|
+
end
|
115
|
+
it "should unset Spice.connection" do
|
116
|
+
Spice.reset!
|
117
|
+
Spice.connection.should be_nil
|
118
|
+
end
|
119
|
+
end
|
120
|
+
describe ".connect!" do
|
121
|
+
it "should create a connection object" do
|
122
|
+
Spice.connect!
|
123
|
+
Spice.connection.should be_a_kind_of(Spice::Connection)
|
124
|
+
end
|
125
|
+
it "connection should contain a host" do
|
126
|
+
Spice.connection.host.should == "localhost"
|
127
|
+
end
|
6
128
|
end
|
7
129
|
end
|