spice 1.0.0.pre → 1.0.0.rc
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +6 -2
- data/Gemfile +2 -0
- data/README.md +5 -3
- data/Rakefile +5 -0
- data/lib/spice.rb +5 -3
- data/lib/spice/client.rb +29 -3
- data/lib/spice/config.rb +22 -3
- data/lib/spice/connection.rb +31 -4
- data/lib/spice/connection/clients.rb +12 -0
- data/lib/spice/connection/cookbooks.rb +19 -7
- data/lib/spice/connection/data_bags.rb +13 -0
- data/lib/spice/connection/environments.rb +12 -0
- data/lib/spice/connection/nodes.rb +14 -0
- data/lib/spice/connection/roles.rb +12 -0
- data/lib/spice/connection/search.rb +4 -0
- data/lib/spice/cookbook.rb +20 -2
- data/lib/spice/cookbook_version.rb +31 -6
- data/lib/spice/data_bag.rb +16 -2
- data/lib/spice/data_bag_item.rb +22 -4
- data/lib/spice/environment.rb +13 -2
- data/lib/spice/error.rb +6 -6
- data/lib/spice/node.rb +19 -2
- data/lib/spice/persistence.rb +23 -3
- data/lib/spice/response/client_error.rb +11 -7
- data/lib/spice/role.rb +19 -3
- data/lib/spice/version.rb +1 -1
- data/spice.gemspec +3 -2
- metadata +47 -37
- data/lib/spice/chef.rb +0 -32
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,15 @@
|
|
1
1
|
# Release Notes - Spice - Version 1.0.0
|
2
2
|
|
3
|
+
* Note: this version of Spice is a major version bump, which means it is *not* backwards-compatible with previous versions.
|
4
|
+
|
3
5
|
## Removed
|
4
6
|
|
5
7
|
* Old-style connections are no longer supported. Please use the connection string like Chef uses (ex. http://chef.example.com:4000)
|
6
8
|
|
9
|
+
## Improvement
|
10
|
+
|
11
|
+
* Complete rewrite! Returned results are now full interactive objects and not just hashes. Create, update, and destroy resources with an ORM-like interface.
|
12
|
+
|
7
13
|
# Release Notes - Spice - Version 0.5.0
|
8
14
|
|
9
15
|
## Bug
|
@@ -15,8 +21,6 @@
|
|
15
21
|
|
16
22
|
* Node support!
|
17
23
|
|
18
|
-
|
19
|
-
|
20
24
|
# Release Notes - Spice - Version 0.3.0
|
21
25
|
|
22
26
|
## Bug
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
# spice
|
1
|
+
# Spice - Chef API Wrapper [![Dependency Status](https://gemnasium.com/danryan/spice.png)][gemnasium]
|
2
2
|
|
3
|
-
|
3
|
+
[gemnasium]: https://gemnasium.com/danryan/spice
|
4
|
+
|
5
|
+
Spice lets you easily integrate your apps with a [Chef](http://opscode.com/chef) server. Spice provides support for the [Chef API](http://wiki.opscode.com/display/chef/Server+API)
|
4
6
|
|
5
7
|
## Installation
|
6
8
|
|
@@ -12,7 +14,7 @@ Of course, You can always grab the source from http://github.com/danryan/spice.
|
|
12
14
|
|
13
15
|
### Deprecation notice
|
14
16
|
|
15
|
-
Explicitly setting a `host`, `port`, and `scheme` value has been
|
17
|
+
Explicitly setting a `host`, `port`, and `scheme` value has been removed in favor of setting a single variable, `server_url`, which matches the format of Chef's client config parameter, `chef_server_url`.
|
16
18
|
|
17
19
|
### Contributors
|
18
20
|
|
data/Rakefile
CHANGED
data/lib/spice.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'virtus'
|
2
|
+
require 'aequitas'
|
3
|
+
require 'active_model/callbacks'
|
4
|
+
require 'active_support/core_ext/hash/deep_merge'
|
5
|
+
require 'active_support/core_ext/hash/keys'
|
3
6
|
require 'mixlib/authentication'
|
4
7
|
|
5
8
|
require 'spice/config'
|
6
9
|
require 'spice/error'
|
7
10
|
require 'spice/authentication'
|
8
|
-
require 'spice/chef'
|
9
11
|
|
10
12
|
require 'spice/role'
|
11
13
|
require 'spice/client'
|
data/lib/spice/client.rb
CHANGED
@@ -2,12 +2,16 @@ require 'spice/persistence'
|
|
2
2
|
|
3
3
|
module Spice
|
4
4
|
class Client
|
5
|
-
include
|
5
|
+
include Virtus
|
6
|
+
include Aequitas
|
6
7
|
include Spice::Persistence
|
7
8
|
extend Spice::Persistence
|
8
|
-
|
9
|
+
|
9
10
|
endpoint "clients"
|
10
11
|
|
12
|
+
# @macro [attach] attribute
|
13
|
+
# @attribute [rw]
|
14
|
+
# @return [$2] the $1 attribute
|
11
15
|
attribute :name, String
|
12
16
|
attribute :public_key, String
|
13
17
|
attribute :private_key, String
|
@@ -18,12 +22,34 @@ module Spice
|
|
18
22
|
|
19
23
|
validates_presence_of :name, :json_class, :chef_type
|
20
24
|
|
21
|
-
|
25
|
+
after_create :wat
|
26
|
+
def wat
|
27
|
+
puts "WAT"
|
28
|
+
end
|
29
|
+
|
22
30
|
def do_post
|
23
31
|
response = connection.post("/clients", :name => name)
|
24
32
|
update_attributes(response.body)
|
25
33
|
response = connection.get("/clients/#{name}")
|
26
34
|
update_attributes(response.body)
|
27
35
|
end
|
36
|
+
|
37
|
+
def do_put
|
38
|
+
response = connection.put("/clients/#{name}", attributes)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.get(name)
|
42
|
+
connection.client(name)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Check if the client exists on the Chef server
|
46
|
+
def new_record?
|
47
|
+
begin
|
48
|
+
connection.get("/clients/#{name}")
|
49
|
+
return false
|
50
|
+
rescue Spice::Error::NotFound
|
51
|
+
return true
|
52
|
+
end
|
53
|
+
end
|
28
54
|
end
|
29
55
|
end
|
data/lib/spice/config.rb
CHANGED
@@ -2,42 +2,61 @@ require 'spice/version'
|
|
2
2
|
|
3
3
|
module Spice
|
4
4
|
module Config
|
5
|
+
# The default Chef server URL
|
5
6
|
DEFAULT_SERVER_URL = "http://localhost:4000"
|
6
7
|
|
8
|
+
# The default Chef version (changing this will enable disable certain features)
|
7
9
|
DEFAULT_CHEF_VERSION = "0.10.8"
|
8
|
-
|
10
|
+
|
11
|
+
# The default Spice User-Agent header
|
9
12
|
DEFAULT_USER_AGENT = "Spice #{Spice::VERSION}"
|
10
13
|
|
14
|
+
# Default connection options
|
11
15
|
DEFAULT_CONNECTION_OPTIONS = {}
|
12
16
|
|
17
|
+
# An array of valid config options
|
13
18
|
VALID_OPTIONS_KEYS = [
|
14
19
|
:server_url,
|
15
20
|
:client_name,
|
16
21
|
:key_file,
|
17
22
|
:raw_key,
|
18
23
|
:chef_version,
|
19
|
-
:adapter,
|
20
24
|
:user_agent,
|
21
25
|
:connection_options
|
22
26
|
]
|
23
27
|
|
24
|
-
|
28
|
+
VALID_OPTIONS_KEYS.each do |key|
|
29
|
+
attr_accessor key
|
30
|
+
end
|
25
31
|
|
32
|
+
# Reset all config options to default when the module is extended
|
26
33
|
def self.extended(base)
|
27
34
|
base.reset
|
28
35
|
end
|
29
36
|
|
37
|
+
# Convenience method to configure Spice in a block
|
38
|
+
# @example Configuring spice
|
39
|
+
# Spice.setup do |s|
|
40
|
+
# s.server_url = "http://chef.example.com:4000"
|
41
|
+
# s.client_name = "admin"
|
42
|
+
# s.key_file = "/home/admin/.chef/admin.pem"
|
43
|
+
# end
|
44
|
+
# @yieldparam Spice
|
45
|
+
# @yieldreturn Spice
|
46
|
+
|
30
47
|
def setup
|
31
48
|
yield self
|
32
49
|
self
|
33
50
|
end
|
34
51
|
|
52
|
+
# Create an options hash from valid options keys
|
35
53
|
def options
|
36
54
|
options = {}
|
37
55
|
VALID_OPTIONS_KEYS.each{|k| options[k] = send(k)}
|
38
56
|
options
|
39
57
|
end
|
40
58
|
|
59
|
+
# Reset all config options to their defaults
|
41
60
|
def reset
|
42
61
|
self.user_agent = DEFAULT_USER_AGENT
|
43
62
|
self.server_url = DEFAULT_SERVER_URL
|
data/lib/spice/connection.rb
CHANGED
@@ -12,10 +12,12 @@ require 'spice/connection/nodes'
|
|
12
12
|
require 'spice/connection/roles'
|
13
13
|
require 'spice/connection/search'
|
14
14
|
|
15
|
+
|
16
|
+
|
15
17
|
module Spice
|
16
18
|
class Connection
|
17
|
-
include
|
18
|
-
|
19
|
+
include Virtus
|
20
|
+
include Aequitas
|
19
21
|
|
20
22
|
include Spice::Connection::Clients
|
21
23
|
include Spice::Connection::Cookbooks
|
@@ -28,6 +30,9 @@ module Spice
|
|
28
30
|
include Spice::Connection::Search
|
29
31
|
include Spice::Request
|
30
32
|
|
33
|
+
# @macro [attach] attribute
|
34
|
+
# @attribute [rw]
|
35
|
+
# @return [$2] the $1 attribute
|
31
36
|
attribute :client_name, String
|
32
37
|
attribute :key_file, String
|
33
38
|
attribute :key, String
|
@@ -46,6 +51,11 @@ module Spice
|
|
46
51
|
URI.parse(server_url)
|
47
52
|
end
|
48
53
|
|
54
|
+
# Perform an HTTP GET request
|
55
|
+
# @param [String] path The relative path
|
56
|
+
# @return [Faraday::Response]
|
57
|
+
# @example Get a list of all nodes
|
58
|
+
# Spice.connection.get("/nodes")
|
49
59
|
def get(path)
|
50
60
|
response = request(:headers => build_headers(
|
51
61
|
:GET,
|
@@ -56,6 +66,12 @@ module Spice
|
|
56
66
|
return response
|
57
67
|
end # def get
|
58
68
|
|
69
|
+
# Perform an HTTP POST request
|
70
|
+
# @param [String] path The relative path
|
71
|
+
# @param [Hash] payload The payload to send with the POST request
|
72
|
+
# @return [Faraday::Response]
|
73
|
+
# @example Create a new client named "foo"
|
74
|
+
# Spice.connection.post("/clients", :name => "foo")
|
59
75
|
def post(path, payload)
|
60
76
|
response = request(:headers => build_headers(
|
61
77
|
:POST,
|
@@ -68,7 +84,13 @@ module Spice
|
|
68
84
|
return response
|
69
85
|
end # def post
|
70
86
|
|
71
|
-
|
87
|
+
# Perform an HTTP PUT request
|
88
|
+
# @param [String] path The relative path
|
89
|
+
# @param [Hash] payload The payload to send with the PUT request
|
90
|
+
# @return [Faraday::Response]
|
91
|
+
# @example Make an existing client "foo" an admin
|
92
|
+
# Spice.connection.put("/clients/foo", :admin => true)
|
93
|
+
def put(path, payload)
|
72
94
|
response = request(:headers => build_headers(
|
73
95
|
:PUT,
|
74
96
|
"#{parsed_url.path}#{path}",
|
@@ -80,7 +102,12 @@ module Spice
|
|
80
102
|
return response
|
81
103
|
end # def put
|
82
104
|
|
83
|
-
|
105
|
+
# Perform an HTTP DELETE request
|
106
|
+
# @param [String] path The relative path
|
107
|
+
# @return [Faraday::Response]
|
108
|
+
# @example Delete the client "foo"
|
109
|
+
# Spice.connection.delete("/clients/foo")
|
110
|
+
def delete(path)
|
84
111
|
response = request(:headers => build_headers(
|
85
112
|
:DELETE,
|
86
113
|
"#{parsed_url.path}#{path}")
|
@@ -1,10 +1,22 @@
|
|
1
1
|
module Spice
|
2
2
|
class Connection
|
3
3
|
module Clients
|
4
|
+
# A collection of clients
|
5
|
+
# @param [Hash] options An options hash that is passed to {Search#search}
|
6
|
+
# @return [Array<Spice::Client>, Array]
|
7
|
+
# @see Search#search
|
8
|
+
# @example Retrieve all clients with names that begin with "app"
|
9
|
+
# Spice.clients(:q => "name:app*")
|
4
10
|
def clients(options={})
|
5
11
|
connection.search('client', options)
|
6
12
|
end
|
7
13
|
|
14
|
+
# Retrieve a single client
|
15
|
+
# @param [String] name The client name
|
16
|
+
# @return [Spice::Client]
|
17
|
+
# @raise [Spice::Error::NotFound] raised when client does not exist
|
18
|
+
# @example Retrieve the client named "admin"
|
19
|
+
# Spice.client("name")
|
8
20
|
def client(name)
|
9
21
|
attributes = connection.get("/clients/#{name}").body
|
10
22
|
Spice::Client.new(attributes)
|
@@ -1,7 +1,11 @@
|
|
1
1
|
module Spice
|
2
2
|
class Connection
|
3
3
|
module Cookbooks
|
4
|
-
|
4
|
+
# Retrieve an array of all cookbooks
|
5
|
+
# @return [Array<Spice::Cookbook>]
|
6
|
+
# @example Retrieve all cookbooks with versions
|
7
|
+
# Spice.cookbooks
|
8
|
+
def cookbooks
|
5
9
|
if Gem::Version.new(Spice.chef_version) >= Gem::Version.new("0.10.0")
|
6
10
|
cookbooks = []
|
7
11
|
connection.get("/cookbooks").body.each_pair do |key, value|
|
@@ -17,24 +21,32 @@ module Spice
|
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
24
|
+
# Retrieve a single cookbook
|
25
|
+
# @param [String] name The name of the cookbook
|
26
|
+
# @return [Spice::Cookbook]
|
27
|
+
# @raise [Spice::Error::NotFound] raised when cookbook does not exist
|
20
28
|
def cookbook(name)
|
21
29
|
if Gem::Version.new(Spice.chef_version) >= Gem::Version.new("0.10.0")
|
22
30
|
cookbook = connection.get("/cookbooks/#{name}").body
|
23
|
-
puts cookbook[name]
|
24
31
|
versions = cookbook[name]['versions'].map{ |v| v['version'] }
|
25
32
|
|
26
33
|
Spice::Cookbook.new(:name => name, :versions => versions)
|
27
34
|
else
|
28
|
-
connection.get("/cookbooks").body
|
29
|
-
|
30
|
-
Spice::Cookbook.new(:name => attributes[0], :versions => attributes[1])
|
31
|
-
end
|
35
|
+
cookbook = connection.get("/cookbooks/#{name}").body
|
36
|
+
Spice::Cookbook.new(:name => name, :versions => cookbook[name])
|
32
37
|
end
|
33
38
|
end
|
34
39
|
|
40
|
+
# Retrieve a single cookbook version
|
41
|
+
# @param [String] name The cookbook name
|
42
|
+
# @param [String] version The cookbook version
|
43
|
+
# @return [Spice::CookbookVersion]
|
44
|
+
# @raise [Spice::Error::NotFound] raised when cookbook version does not exist
|
35
45
|
def cookbook_version(name, version)
|
36
46
|
attributes = connection.get("/cookbooks/#{name}/#{version}").body
|
37
|
-
|
47
|
+
duped_attributes = attributes.dup
|
48
|
+
duped_attributes[:_attributes] = attributes['attributes']
|
49
|
+
Spice::CookbookVersion.new(duped_attributes)
|
38
50
|
end
|
39
51
|
|
40
52
|
end # module Cookbooks
|
@@ -1,6 +1,10 @@
|
|
1
1
|
module Spice
|
2
2
|
class Connection
|
3
3
|
module DataBags
|
4
|
+
# Retrieve an array of all data bags
|
5
|
+
# @return [Array<Spice::DataBag>]
|
6
|
+
# @example Retrieve all data bags
|
7
|
+
# Spice.data_bags
|
4
8
|
def data_bags
|
5
9
|
connection.get("/data").body.keys.map do |data_bag|
|
6
10
|
items = connection.search(data_bag)
|
@@ -10,11 +14,20 @@ module Spice
|
|
10
14
|
|
11
15
|
alias :data :data_bags
|
12
16
|
|
17
|
+
# Retrieve a single data bag and its items
|
18
|
+
# @param [String] name The data bag name
|
19
|
+
# @return [Spice::DataBag]
|
20
|
+
# @raise [Spice::Error::NotFound] raised when data bag does not exist
|
13
21
|
def data_bag(name)
|
14
22
|
items = connection.search(name)
|
15
23
|
Spice::DataBag.new(:name => name, :items => items)
|
16
24
|
end
|
17
25
|
|
26
|
+
# Retrieve a single data bag item
|
27
|
+
# @param [String] name The data bag name
|
28
|
+
# @param [String] id The data bag item id
|
29
|
+
# @return [Spice::DataBagItem]
|
30
|
+
# @raise [Spice::Error::NotFound] raised when data bag item does not exist
|
18
31
|
def data_bag_item(name, id)
|
19
32
|
data = connection.get("/data/#{name}/#{id}")
|
20
33
|
data.delete('id')
|
@@ -1,10 +1,22 @@
|
|
1
1
|
module Spice
|
2
2
|
class Connection
|
3
3
|
module Environments
|
4
|
+
# A collection of environments
|
5
|
+
# @param [Hash] options An options hash that is passed to {Search#search}
|
6
|
+
# @return [Array<Spice::Environment>]
|
7
|
+
# @see Search#search
|
8
|
+
# @example Retrieve all environments with names that begin with "prod"
|
9
|
+
# Spice.environments(:q => "name:prod*")
|
4
10
|
def environments(options={})
|
5
11
|
connection.search('environment', options)
|
6
12
|
end
|
7
13
|
|
14
|
+
# Retrieve a single environment
|
15
|
+
# @param [String] name The environment name
|
16
|
+
# @return [Spice::Environment]
|
17
|
+
# @raise [Spice::Error::NotFound] raised when environment does not exist
|
18
|
+
# @example Retrieve the environment named "production"
|
19
|
+
# Spice.environment("production")
|
8
20
|
def environment(name)
|
9
21
|
attributes = connection.get("/environments/#{name}").body
|
10
22
|
attributes['attrs'] = attributes.delete('attributes')
|
@@ -1,10 +1,24 @@
|
|
1
1
|
module Spice
|
2
2
|
class Connection
|
3
3
|
module Nodes
|
4
|
+
# A collection of nodes
|
5
|
+
# @param [Hash] options An options hash that is passed to {Search#search}
|
6
|
+
# @return [Array<Spice::Node>]
|
7
|
+
# @see Search#search
|
8
|
+
# @example Retrieve all nodes that have the role "base"
|
9
|
+
# Spice.nodes(:q => "roles:base")
|
10
|
+
# @example Retrieve nodes with role "base" in the "production" environment
|
11
|
+
# Spice.nodes(:q => "roles:base AND environment:production")
|
4
12
|
def nodes(options={})
|
5
13
|
connection.search('node', options)
|
6
14
|
end
|
7
15
|
|
16
|
+
# Retrieve a single client
|
17
|
+
# @param [String] name The node name
|
18
|
+
# @return [Spice::Node]
|
19
|
+
# @raise [Spice::Error::NotFound] raised when node does not exist
|
20
|
+
# @example Retrieve the node named "app.example.com"
|
21
|
+
# Spice.node("app.example.com")
|
8
22
|
def node(name)
|
9
23
|
node_attributes = connection.get("/nodes/#{name}").body
|
10
24
|
Spice::Node.new(node_attributes)
|
@@ -1,10 +1,22 @@
|
|
1
1
|
module Spice
|
2
2
|
class Connection
|
3
3
|
module Roles
|
4
|
+
# A collection of roles
|
5
|
+
# @param [Hash] options An options hash that is passed to {Search#search}
|
6
|
+
# @return [Array<Spice::Role>]
|
7
|
+
# @see Search#search
|
8
|
+
# @example Retrieve all roles that start with "app_"
|
9
|
+
# Spice.roles(:q => "name:app_*")
|
4
10
|
def roles(options={})
|
5
11
|
connection.search('role', options)
|
6
12
|
end
|
7
13
|
|
14
|
+
# Retrieve a single role
|
15
|
+
# @param [String] name The role name
|
16
|
+
# @return [Spice::Role]
|
17
|
+
# @raise [Spice::Error::NotFound] raised when role does not exist
|
18
|
+
# @example Retrieve the role "app_server"
|
19
|
+
# Spice.role("app_server")
|
8
20
|
def role(name)
|
9
21
|
attributes = connection.get("/roles/#{name}").body
|
10
22
|
Spice::Role.new(attributes)
|
@@ -3,6 +3,10 @@ require 'cgi'
|
|
3
3
|
module Spice
|
4
4
|
class Connection
|
5
5
|
module Search
|
6
|
+
# @option options [String] :q The Solr search query string
|
7
|
+
# @option options [String] :sort Order by which to sort the results
|
8
|
+
# @option options [Numeric] :start The number by which to offset the results
|
9
|
+
# @option options [Numeric] :rows The maximum number of rows to return
|
6
10
|
def search(index, options={})
|
7
11
|
options = {:q => options} if options.is_a? String
|
8
12
|
options.symbolize_keys!
|
data/lib/spice/cookbook.rb
CHANGED
@@ -2,15 +2,33 @@ require 'spice/persistence'
|
|
2
2
|
|
3
3
|
module Spice
|
4
4
|
class Cookbook
|
5
|
-
include
|
5
|
+
include Virtus
|
6
|
+
include Aequitas
|
6
7
|
include Spice::Persistence
|
7
8
|
extend Spice::Persistence
|
8
|
-
|
9
|
+
|
9
10
|
endpoint "cookbooks"
|
10
11
|
|
12
|
+
# @macro [attach] attribute
|
13
|
+
# @attribute [rw]
|
14
|
+
# @return [$2] the $1 attribute
|
11
15
|
attribute :name, String
|
12
16
|
attribute :versions, Array, :default => []
|
13
17
|
|
14
18
|
validates_presence_of :name
|
19
|
+
|
20
|
+
def self.get(name)
|
21
|
+
connection.cookbook(name)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Check if the cookbook exists on the Chef server
|
25
|
+
def new_record?
|
26
|
+
begin
|
27
|
+
connection.get("/cookbooks/#{name}")
|
28
|
+
return false
|
29
|
+
rescue Spice::Error::NotFound
|
30
|
+
return true
|
31
|
+
end
|
32
|
+
end
|
15
33
|
end
|
16
34
|
end
|
@@ -2,23 +2,26 @@ require 'spice/persistence'
|
|
2
2
|
|
3
3
|
module Spice
|
4
4
|
class CookbookVersion
|
5
|
-
include
|
5
|
+
include Virtus
|
6
|
+
include Aequitas
|
6
7
|
include Spice::Persistence
|
7
8
|
extend Spice::Persistence
|
8
|
-
|
9
|
+
|
9
10
|
endpoint "cookbooks"
|
10
11
|
|
12
|
+
# @macro [attach] attribute
|
13
|
+
# @attribute [rw]
|
14
|
+
# @return [$2] the $1 attribute
|
11
15
|
attribute :name, String
|
12
16
|
attribute :version, String
|
13
17
|
attribute :definitions, Array, :default => []
|
14
|
-
attribute :attributes, Array, :default => []
|
15
18
|
attribute :files, Array, :default => []
|
16
19
|
attribute :providers, Array, :default => []
|
17
20
|
attribute :metadata, Hash, :default => {}
|
18
21
|
attribute :libraries, Array, :default => []
|
19
22
|
attribute :templates, Array, :default => []
|
20
23
|
attribute :resources, Array, :default => []
|
21
|
-
attribute :
|
24
|
+
attribute :_attributes, Array, :default => []
|
22
25
|
attribute :json_class, String, :default => "Chef::CookbookVersion"
|
23
26
|
attribute :cookbook_name, String
|
24
27
|
attribute :version, String
|
@@ -29,15 +32,37 @@ module Spice
|
|
29
32
|
validates_presence_of :name
|
30
33
|
|
31
34
|
def do_post
|
32
|
-
|
35
|
+
duped_attributes = attributes.dup
|
36
|
+
duped_attributes[:attributes] = attributes[:_attributes]
|
37
|
+
duped_attributes.delete(:_attributes)
|
38
|
+
|
39
|
+
connection.put("/cookbooks/#{cookbook_name}/#{version}", duped_attributes)
|
33
40
|
end
|
34
41
|
|
35
42
|
def do_put
|
36
|
-
|
43
|
+
duped_attributes = attributes.dup
|
44
|
+
duped_attributes[:attributes] = attributes[:_attributes]
|
45
|
+
duped_attributes.delete(:_attributes)
|
46
|
+
|
47
|
+
connection.put("/cookbooks/#{cookbook_name}/#{version}", duped_attributes)
|
37
48
|
end
|
38
49
|
|
39
50
|
def do_delete
|
40
51
|
connection.delete("/cookbooks/#{cookbook_name}/#{version}")
|
41
52
|
end
|
53
|
+
|
54
|
+
def self.get(name, version)
|
55
|
+
connection.cookbook_version(name, version)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Check if the cookbook version exists on the Chef server
|
59
|
+
def new_record?
|
60
|
+
begin
|
61
|
+
connection.get("/cookbooks/#{name.split('-').first}/#{version}")
|
62
|
+
return false
|
63
|
+
rescue Spice::Error::NotFound
|
64
|
+
return true
|
65
|
+
end
|
66
|
+
end
|
42
67
|
end
|
43
68
|
end
|
data/lib/spice/data_bag.rb
CHANGED
@@ -2,12 +2,16 @@ require 'spice/persistence'
|
|
2
2
|
|
3
3
|
module Spice
|
4
4
|
class DataBag
|
5
|
-
include
|
5
|
+
include Virtus
|
6
|
+
include Aequitas
|
6
7
|
include Spice::Persistence
|
7
8
|
extend Spice::Persistence
|
8
|
-
|
9
|
+
|
9
10
|
endpoint "data"
|
10
11
|
|
12
|
+
# @macro [attach] attribute
|
13
|
+
# @attribute [rw]
|
14
|
+
# @return [$2] the $1 attribute
|
11
15
|
attribute :name, String
|
12
16
|
attribute :items, Array, :default => []
|
13
17
|
|
@@ -24,5 +28,15 @@ module Spice
|
|
24
28
|
def do_post
|
25
29
|
response = connection.post("/data", attributes)
|
26
30
|
end
|
31
|
+
|
32
|
+
# Check if the data bag exists on the Chef server
|
33
|
+
def new_record?
|
34
|
+
begin
|
35
|
+
connection.get("/data/#{name}")
|
36
|
+
return false
|
37
|
+
rescue Spice::Error::NotFound
|
38
|
+
return true
|
39
|
+
end
|
40
|
+
end
|
27
41
|
end
|
28
42
|
end
|
data/lib/spice/data_bag_item.rb
CHANGED
@@ -1,12 +1,20 @@
|
|
1
1
|
module Spice
|
2
2
|
class DataBagItem
|
3
|
-
include
|
3
|
+
include Virtus
|
4
|
+
include Aequitas
|
4
5
|
include Spice::Persistence
|
5
6
|
extend Spice::Persistence
|
6
|
-
|
7
|
+
|
7
8
|
endpoint "data"
|
8
9
|
|
10
|
+
# The _id attribute is used as the "id" field in the data bag item.
|
11
|
+
# "id" is an attribute reserved by ToyStore, the attribute system used by Spice.
|
12
|
+
# @attribute [rw]
|
13
|
+
# @return [String] the _attribute
|
9
14
|
attribute :_id, String
|
15
|
+
# @macro [attach] attribute
|
16
|
+
# @attribute [rw]
|
17
|
+
# @return [$2] the $1 attribute
|
10
18
|
attribute :data, Hash, :default => {}
|
11
19
|
attribute :name, String
|
12
20
|
|
@@ -18,18 +26,28 @@ module Spice
|
|
18
26
|
|
19
27
|
def do_post
|
20
28
|
attrs = data.dup
|
21
|
-
attrs[
|
29
|
+
attrs[:id] = attributes[:_id]
|
22
30
|
connection.post("/data/#{name}", attrs)
|
23
31
|
end
|
24
32
|
|
25
33
|
def do_put
|
26
34
|
attrs = data.dup
|
27
|
-
attrs[
|
35
|
+
attrs[:id] = attributes[:_id]
|
28
36
|
connection.put("/data/#{name}/#{_id}", attrs)
|
29
37
|
end
|
30
38
|
|
31
39
|
def do_delete
|
32
40
|
connection.delete("/data/#{name}/#{_id}")
|
33
41
|
end
|
42
|
+
|
43
|
+
# Check if the data bag item exists on the Chef server
|
44
|
+
def new_record?
|
45
|
+
begin
|
46
|
+
connection.get("/data/#{name}/#{_id}")
|
47
|
+
return false
|
48
|
+
rescue Spice::Error::NotFound
|
49
|
+
return true
|
50
|
+
end
|
51
|
+
end
|
34
52
|
end
|
35
53
|
end
|
data/lib/spice/environment.rb
CHANGED
@@ -2,12 +2,16 @@ require 'spice/persistence'
|
|
2
2
|
|
3
3
|
module Spice
|
4
4
|
class Environment
|
5
|
-
include
|
5
|
+
include Virtus
|
6
|
+
include Aequitas
|
6
7
|
include Spice::Persistence
|
7
8
|
extend Spice::Persistence
|
8
|
-
|
9
|
+
|
9
10
|
endpoint "environments"
|
10
11
|
|
12
|
+
# @macro [attach] attribute
|
13
|
+
# @attribute [rw]
|
14
|
+
# @return [$2] the $1 attribute
|
11
15
|
attribute :name, String
|
12
16
|
attribute :description, String
|
13
17
|
attribute :attrs, Hash, :default => {}
|
@@ -17,5 +21,12 @@ module Spice
|
|
17
21
|
|
18
22
|
validates_presence_of :name, :description
|
19
23
|
|
24
|
+
# Check if the environment exists on the Chef server
|
25
|
+
def new_record?
|
26
|
+
connection.get("/environments/#{name}")
|
27
|
+
return false
|
28
|
+
rescue Spice::Error::NotFound
|
29
|
+
return true
|
30
|
+
end
|
20
31
|
end
|
21
32
|
end
|
data/lib/spice/error.rb
CHANGED
@@ -9,22 +9,22 @@ module Spice
|
|
9
9
|
|
10
10
|
end
|
11
11
|
|
12
|
-
class BadRequest < Error
|
12
|
+
class Error::BadRequest < Error
|
13
13
|
end
|
14
14
|
|
15
|
-
class Unauthorized < Error
|
15
|
+
class Error::Unauthorized < Error
|
16
16
|
end
|
17
17
|
|
18
|
-
class Forbidden < Error
|
18
|
+
class Error::Forbidden < Error
|
19
19
|
end
|
20
20
|
|
21
|
-
class NotFound < Error
|
21
|
+
class Error::NotFound < Error
|
22
22
|
end
|
23
23
|
|
24
|
-
class NotAcceptable < Error
|
24
|
+
class Error::NotAcceptable < Error
|
25
25
|
end
|
26
26
|
|
27
|
-
class Conflict < Error
|
27
|
+
class Error::Conflict < Error
|
28
28
|
end
|
29
29
|
|
30
30
|
end
|
data/lib/spice/node.rb
CHANGED
@@ -2,12 +2,16 @@ require 'spice/persistence'
|
|
2
2
|
|
3
3
|
module Spice
|
4
4
|
class Node
|
5
|
-
include
|
5
|
+
include Virtus
|
6
|
+
include Aequitas
|
6
7
|
include Spice::Persistence
|
7
8
|
extend Spice::Persistence
|
8
|
-
|
9
|
+
|
9
10
|
endpoint "nodes"
|
10
11
|
|
12
|
+
# @macro [attach] attribute
|
13
|
+
# @attribute [rw]
|
14
|
+
# @return [$2] the $1 attribute
|
11
15
|
attribute :name, String
|
12
16
|
attribute :chef_type, String, :default => "node"
|
13
17
|
attribute :json_class, String, :default => "Chef::Node"
|
@@ -19,5 +23,18 @@ module Spice
|
|
19
23
|
|
20
24
|
validates_presence_of :name
|
21
25
|
|
26
|
+
def self.get(name)
|
27
|
+
connection.node(name)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Check if the node exists on the Chef server
|
31
|
+
def new_record?
|
32
|
+
begin
|
33
|
+
connection.get("/nodes/#{name}")
|
34
|
+
return false
|
35
|
+
rescue Spice::Error::NotFound
|
36
|
+
return true
|
37
|
+
end
|
38
|
+
end
|
22
39
|
end
|
23
40
|
end
|
data/lib/spice/persistence.rb
CHANGED
@@ -1,9 +1,26 @@
|
|
1
1
|
module Spice
|
2
2
|
module Persistence
|
3
3
|
def self.included(base)
|
4
|
-
base.
|
5
|
-
base.
|
6
|
-
base.
|
4
|
+
base.extend ActiveModel::Callbacks
|
5
|
+
base.send(:define_model_callbacks, :create, :update, :destroy)
|
6
|
+
base.send(:after_create, :do_post)
|
7
|
+
base.send(:after_update, :do_put)
|
8
|
+
base.send(:after_destroy, :do_delete)
|
9
|
+
end
|
10
|
+
|
11
|
+
def create
|
12
|
+
run_callbacks :create do
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def update
|
17
|
+
run_callbacks :update do
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def destroy
|
22
|
+
run_callbacks :destroy do
|
23
|
+
end
|
7
24
|
end
|
8
25
|
|
9
26
|
def endpoint(ep=nil)
|
@@ -38,5 +55,8 @@ module Spice
|
|
38
55
|
connection.delete("/#{self.class.endpoint}/#{name}")
|
39
56
|
end
|
40
57
|
|
58
|
+
def new_record?
|
59
|
+
raise NotImplementedError, "Override this method in the class that includes this module."
|
60
|
+
end
|
41
61
|
end
|
42
62
|
end
|
@@ -7,22 +7,26 @@ module Spice
|
|
7
7
|
def on_complete(env)
|
8
8
|
case env[:status].to_i
|
9
9
|
when 400
|
10
|
-
raise Spice::BadRequest.new(error(env[:body]), env[:request_headers])
|
10
|
+
raise Spice::Error::BadRequest.new(error(env[:body]), env[:request_headers])
|
11
11
|
when 401
|
12
|
-
raise Spice::Unauthorized.new(error(env[:body]), env[:request_headers])
|
12
|
+
raise Spice::Error::Unauthorized.new(error(env[:body]), env[:request_headers])
|
13
13
|
when 403
|
14
|
-
raise Spice::Forbidden.new(error(env[:body]), env[:request_headers])
|
14
|
+
raise Spice::Error::Forbidden.new(error(env[:body]), env[:request_headers])
|
15
15
|
when 404
|
16
|
-
raise Spice::NotFound.new(error(env[:body]), env[:request_headers])
|
16
|
+
raise Spice::Error::NotFound.new(error(env[:body]), env[:request_headers])
|
17
17
|
when 406
|
18
|
-
raise Spice::NotAcceptable.new(error(env[:body]), env[:request_headers])
|
18
|
+
raise Spice::Error::NotAcceptable.new(error(env[:body]), env[:request_headers])
|
19
19
|
when 409
|
20
|
-
raise Spice::Conflict.new(error(env[:body]), env[:request_headers])
|
20
|
+
raise Spice::Error::Conflict.new(error(env[:body]), env[:request_headers])
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
def error(body)
|
25
|
-
body["error"].
|
25
|
+
if body["error"].kind_of?(Array)
|
26
|
+
body["error"].join(',')
|
27
|
+
else
|
28
|
+
body["error"]
|
29
|
+
end
|
26
30
|
end
|
27
31
|
|
28
32
|
end
|
data/lib/spice/role.rb
CHANGED
@@ -2,13 +2,16 @@ require 'spice/persistence'
|
|
2
2
|
|
3
3
|
module Spice
|
4
4
|
class Role
|
5
|
-
include
|
5
|
+
include Virtus
|
6
|
+
include Aequitas
|
6
7
|
include Spice::Persistence
|
7
8
|
extend Spice::Persistence
|
8
9
|
|
9
|
-
store :memory, {}
|
10
10
|
endpoint "roles"
|
11
11
|
|
12
|
+
# @macro [attach] attribute
|
13
|
+
# @attribute [rw]
|
14
|
+
# @return [$2] the $1 attribute
|
12
15
|
attribute :name, String
|
13
16
|
attribute :description, String
|
14
17
|
attribute :run_list, Array, :default => []
|
@@ -18,6 +21,19 @@ module Spice
|
|
18
21
|
attribute :chef_type, String, :default => "role"
|
19
22
|
|
20
23
|
validates_presence_of :name, :description
|
21
|
-
|
24
|
+
|
25
|
+
def self.get(name)
|
26
|
+
connection.role(name)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Check if the role exists on the Chef server
|
30
|
+
def new_record?
|
31
|
+
begin
|
32
|
+
connection.get("/roles/#{name}")
|
33
|
+
return false
|
34
|
+
rescue Spice::Error::NotFound
|
35
|
+
return true
|
36
|
+
end
|
37
|
+
end
|
22
38
|
end
|
23
39
|
end
|
data/lib/spice/version.rb
CHANGED
data/spice.gemspec
CHANGED
@@ -14,8 +14,9 @@ Gem::Specification.new do |s|
|
|
14
14
|
|
15
15
|
s.rubyforge_project = "spice"
|
16
16
|
|
17
|
-
s.add_dependency "
|
18
|
-
s.add_dependency "
|
17
|
+
s.add_dependency "virtus", ">= 0.3.0"
|
18
|
+
s.add_dependency "aequitas", ">= 0.0.2"
|
19
|
+
s.add_dependency "activemodel"
|
19
20
|
s.add_dependency "faraday"
|
20
21
|
s.add_dependency "mixlib-authentication", '>= 1.1.4'
|
21
22
|
s.add_dependency "yajl-ruby", '>= 1.1.0'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.rc
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,33 +9,44 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-03-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement: &
|
15
|
+
name: virtus
|
16
|
+
requirement: &70252408715180 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
21
|
+
version: 0.3.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70252408715180
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement: &
|
26
|
+
name: aequitas
|
27
|
+
requirement: &70252408714580 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0.
|
32
|
+
version: 0.0.2
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70252408714580
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: activemodel
|
38
|
+
requirement: &70252408713960 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70252408713960
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: faraday
|
38
|
-
requirement: &
|
49
|
+
requirement: &70252408713220 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
52
|
- - ! '>='
|
@@ -43,10 +54,10 @@ dependencies:
|
|
43
54
|
version: '0'
|
44
55
|
type: :runtime
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
57
|
+
version_requirements: *70252408713220
|
47
58
|
- !ruby/object:Gem::Dependency
|
48
59
|
name: mixlib-authentication
|
49
|
-
requirement: &
|
60
|
+
requirement: &70252408711780 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ! '>='
|
@@ -54,10 +65,10 @@ dependencies:
|
|
54
65
|
version: 1.1.4
|
55
66
|
type: :runtime
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *70252408711780
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: yajl-ruby
|
60
|
-
requirement: &
|
71
|
+
requirement: &70252408710960 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ! '>='
|
@@ -65,10 +76,10 @@ dependencies:
|
|
65
76
|
version: 1.1.0
|
66
77
|
type: :runtime
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *70252408710960
|
69
80
|
- !ruby/object:Gem::Dependency
|
70
81
|
name: rspec
|
71
|
-
requirement: &
|
82
|
+
requirement: &70252408709640 !ruby/object:Gem::Requirement
|
72
83
|
none: false
|
73
84
|
requirements:
|
74
85
|
- - ! '>='
|
@@ -76,10 +87,10 @@ dependencies:
|
|
76
87
|
version: 2.6.0
|
77
88
|
type: :development
|
78
89
|
prerelease: false
|
79
|
-
version_requirements: *
|
90
|
+
version_requirements: *70252408709640
|
80
91
|
- !ruby/object:Gem::Dependency
|
81
92
|
name: webmock
|
82
|
-
requirement: &
|
93
|
+
requirement: &70252408709080 !ruby/object:Gem::Requirement
|
83
94
|
none: false
|
84
95
|
requirements:
|
85
96
|
- - ! '>='
|
@@ -87,10 +98,10 @@ dependencies:
|
|
87
98
|
version: 1.6.2
|
88
99
|
type: :development
|
89
100
|
prerelease: false
|
90
|
-
version_requirements: *
|
101
|
+
version_requirements: *70252408709080
|
91
102
|
- !ruby/object:Gem::Dependency
|
92
103
|
name: timecop
|
93
|
-
requirement: &
|
104
|
+
requirement: &70252408708260 !ruby/object:Gem::Requirement
|
94
105
|
none: false
|
95
106
|
requirements:
|
96
107
|
- - ! '>='
|
@@ -98,10 +109,10 @@ dependencies:
|
|
98
109
|
version: 0.3.5
|
99
110
|
type: :development
|
100
111
|
prerelease: false
|
101
|
-
version_requirements: *
|
112
|
+
version_requirements: *70252408708260
|
102
113
|
- !ruby/object:Gem::Dependency
|
103
114
|
name: guard
|
104
|
-
requirement: &
|
115
|
+
requirement: &70252408707260 !ruby/object:Gem::Requirement
|
105
116
|
none: false
|
106
117
|
requirements:
|
107
118
|
- - ! '>='
|
@@ -109,10 +120,10 @@ dependencies:
|
|
109
120
|
version: 0.6.2
|
110
121
|
type: :development
|
111
122
|
prerelease: false
|
112
|
-
version_requirements: *
|
123
|
+
version_requirements: *70252408707260
|
113
124
|
- !ruby/object:Gem::Dependency
|
114
125
|
name: guard-rspec
|
115
|
-
requirement: &
|
126
|
+
requirement: &70252408705920 !ruby/object:Gem::Requirement
|
116
127
|
none: false
|
117
128
|
requirements:
|
118
129
|
- - ! '>='
|
@@ -120,10 +131,10 @@ dependencies:
|
|
120
131
|
version: 0.4.2
|
121
132
|
type: :development
|
122
133
|
prerelease: false
|
123
|
-
version_requirements: *
|
134
|
+
version_requirements: *70252408705920
|
124
135
|
- !ruby/object:Gem::Dependency
|
125
136
|
name: guard-spork
|
126
|
-
requirement: &
|
137
|
+
requirement: &70252408705040 !ruby/object:Gem::Requirement
|
127
138
|
none: false
|
128
139
|
requirements:
|
129
140
|
- - ! '>='
|
@@ -131,10 +142,10 @@ dependencies:
|
|
131
142
|
version: 0.2.1
|
132
143
|
type: :development
|
133
144
|
prerelease: false
|
134
|
-
version_requirements: *
|
145
|
+
version_requirements: *70252408705040
|
135
146
|
- !ruby/object:Gem::Dependency
|
136
147
|
name: spork
|
137
|
-
requirement: &
|
148
|
+
requirement: &70252408704200 !ruby/object:Gem::Requirement
|
138
149
|
none: false
|
139
150
|
requirements:
|
140
151
|
- - ! '>='
|
@@ -142,10 +153,10 @@ dependencies:
|
|
142
153
|
version: 0.9.0.rc8
|
143
154
|
type: :development
|
144
155
|
prerelease: false
|
145
|
-
version_requirements: *
|
156
|
+
version_requirements: *70252408704200
|
146
157
|
- !ruby/object:Gem::Dependency
|
147
158
|
name: rb-fsevent
|
148
|
-
requirement: &
|
159
|
+
requirement: &70252408703560 !ruby/object:Gem::Requirement
|
149
160
|
none: false
|
150
161
|
requirements:
|
151
162
|
- - ! '>='
|
@@ -153,10 +164,10 @@ dependencies:
|
|
153
164
|
version: 0.4.3.1
|
154
165
|
type: :development
|
155
166
|
prerelease: false
|
156
|
-
version_requirements: *
|
167
|
+
version_requirements: *70252408703560
|
157
168
|
- !ruby/object:Gem::Dependency
|
158
169
|
name: growl
|
159
|
-
requirement: &
|
170
|
+
requirement: &70252408703080 !ruby/object:Gem::Requirement
|
160
171
|
none: false
|
161
172
|
requirements:
|
162
173
|
- - ! '>='
|
@@ -164,7 +175,7 @@ dependencies:
|
|
164
175
|
version: 1.0.3
|
165
176
|
type: :development
|
166
177
|
prerelease: false
|
167
|
-
version_requirements: *
|
178
|
+
version_requirements: *70252408703080
|
168
179
|
description: Spice is a zesty Chef API wrapper. Its primary purpose is to let you
|
169
180
|
easily integrate your apps with a Chef server easily. Spice provides support for
|
170
181
|
the entire released Chef API
|
@@ -187,7 +198,6 @@ files:
|
|
187
198
|
- TODO.md
|
188
199
|
- lib/spice.rb
|
189
200
|
- lib/spice/authentication.rb
|
190
|
-
- lib/spice/chef.rb
|
191
201
|
- lib/spice/client.rb
|
192
202
|
- lib/spice/config.rb
|
193
203
|
- lib/spice/connection.rb
|
@@ -250,7 +260,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
250
260
|
version: '0'
|
251
261
|
segments:
|
252
262
|
- 0
|
253
|
-
hash: -
|
263
|
+
hash: -2243516170777733948
|
254
264
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
255
265
|
none: false
|
256
266
|
requirements:
|
@@ -259,7 +269,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
259
269
|
version: 1.3.1
|
260
270
|
requirements: []
|
261
271
|
rubyforge_project: spice
|
262
|
-
rubygems_version: 1.8.
|
272
|
+
rubygems_version: 1.8.17
|
263
273
|
signing_key:
|
264
274
|
specification_version: 3
|
265
275
|
summary: Chef API wrapper
|
data/lib/spice/chef.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
module Spice
|
2
|
-
class Chef
|
3
|
-
attr_accessor :client_name, :key_file, :connection
|
4
|
-
|
5
|
-
def self.connection
|
6
|
-
@connection ||= Spice.connection
|
7
|
-
end
|
8
|
-
|
9
|
-
class << self
|
10
|
-
def clients
|
11
|
-
@clients ||= Client.all
|
12
|
-
end
|
13
|
-
|
14
|
-
def nodes
|
15
|
-
@nodes ||= Node.all
|
16
|
-
end
|
17
|
-
|
18
|
-
def data_bags
|
19
|
-
@data_bags ||= DataBag.all
|
20
|
-
end
|
21
|
-
|
22
|
-
def roles
|
23
|
-
@roles ||= Role.all
|
24
|
-
end
|
25
|
-
|
26
|
-
def cookbooks
|
27
|
-
@cookbooks ||= Cookbook.all
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|