spice 1.0.0.pre → 1.0.0.rc
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/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 [][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
|
-
|