spice 0.8.0 → 1.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,43 @@
1
+ require 'spice/persistence'
2
+
3
+ module Spice
4
+ class CookbookVersion
5
+ include Toy::Store
6
+ include Spice::Persistence
7
+ extend Spice::Persistence
8
+ store :memory, {}
9
+ endpoint "cookbooks"
10
+
11
+ attribute :name, String
12
+ attribute :version, String
13
+ attribute :definitions, Array, :default => []
14
+ attribute :attributes, Array, :default => []
15
+ attribute :files, Array, :default => []
16
+ attribute :providers, Array, :default => []
17
+ attribute :metadata, Hash, :default => {}
18
+ attribute :libraries, Array, :default => []
19
+ attribute :templates, Array, :default => []
20
+ attribute :resources, Array, :default => []
21
+ attribute :attributes, Array, :default => []
22
+ attribute :json_class, String, :default => "Chef::CookbookVersion"
23
+ attribute :cookbook_name, String
24
+ attribute :version, String
25
+ attribute :recipes, Array, :default => []
26
+ attribute :root_files, Array, :default => []
27
+ attribute :chef_type, String, :default => "cookbook_version"
28
+
29
+ validates_presence_of :name
30
+
31
+ def do_post
32
+ connection.put("/cookbooks/#{cookbook_name}/#{version}", attributes)
33
+ end
34
+
35
+ def do_put
36
+ connection.put("/cookbooks/#{cookbook_name}/#{version}", attributes)
37
+ end
38
+
39
+ def do_delete
40
+ connection.delete("/cookbooks/#{cookbook_name}/#{version}")
41
+ end
42
+ end
43
+ end
@@ -1,132 +1,28 @@
1
+ require 'spice/persistence'
2
+
1
3
  module Spice
2
- class DataBag < Spice::Chef
3
- # Get a list of all data bags in the following syntax
4
- # Spice::DataBag.all
5
- #
6
- # @param [Hash] options the options hash. Currently does nothing
7
- def self.all(options={})
8
- connection.get("/data")
9
- end
10
-
11
- # An alternative format for showing the contents of a data bag
12
- # @example Retrieve the id and uri of items in a data bag called "users"
13
- # Spice::DataBag["users"] # => {"adam":"http://localhost:4000/data/users/adam"}
14
- def self.[](name)
15
- connection.get("/data/#{name}")
16
- end
4
+ class DataBag
5
+ include Toy::Store
6
+ include Spice::Persistence
7
+ extend Spice::Persistence
8
+ store :memory, {}
9
+ endpoint "data"
17
10
 
18
- # Show the contents of a data bag
19
- # @example Retrieve the id and uri of items in a data bag called "users"
20
- # Spice::DataBag.show(:name => "users") # => {"adam":"http://localhost:4000/data/users/adam"}
21
- #
22
- # @param [Hash] options The options hash
23
- # @option options [String] :name The name of your data bag
24
- def self.show(options={})
25
- raise ArgumentError, "Option :name must be present" unless options[:name]
26
- name = options.delete(:name)
27
- connection.get("/data/#{name}")
28
- end
29
-
30
- # Create a a new data bag
31
- #
32
- # @example
33
- # Spice::DataBag.create(:name => "users")
34
- #
35
- # @param [Hash] options the options hash from which to create a data bag
36
- # @option options [String] :name The name of your data bag
11
+ attribute :name, String
12
+ attribute :items, Array, :default => []
37
13
 
38
- def self.create(options={})
39
- connection.post("/data", options)
40
- end
41
-
42
- # Delete a data bag
43
- #
44
- # @example
45
- # Spice::DataBag.delete(:name => "users")
46
- #
47
- # @param [Hash] options the options hash from which to delete a data bag
48
- # @option options [String] :name The name of your data bag
14
+ validates_presence_of :name
49
15
 
50
- def self.delete(options={})
51
- raise ArgumentError, "Option :name must be present" unless options[:name]
52
- name = options.delete(:name)
53
- connection.delete("/data/#{name}", options)
16
+ def self.all
17
+ connection.data_bags
54
18
  end
55
19
 
56
- # Shows a data bag item
57
- #
58
- # @example
59
- # Spice::DataBag.show_item(:name => "users", :id => "adam")
60
- #
61
- # @param [Hash] options the options hash from which to create a data bag
62
- # @option options [String] :name The name of your data bag
63
- # @option options [String] :id The id of the data bag item
64
-
65
- def self.show_item(options={})
66
- raise ArgumentError, "Option :name must be present" unless options[:name]
67
- raise ArgumentError, "Option :id must be present" unless options[:id]
68
- name = options.delete(:name)
69
- id = options.delete(:id)
70
- connection.get("/data/#{name}/#{id}", options)
71
- end
72
-
73
- # Creates a data bag item
74
- #
75
- # @example
76
- # Spice::DataBag.create_item(:name => "users", :id => "adam", :title => "Supreme Awesomer")
77
- #
78
- # @param [Hash] options the options hash from which to create a data bag
79
- # @option options [String] :name The name of your data bag
80
- # @option options [String] :id The id of the data bag item
81
- #
82
- # Any additional keys in the options hash will be used as attributes
83
- # to be stored in the data bag item
84
-
85
- def self.create_item(options={})
86
- raise ArgumentError, "Option :name must be present" unless options[:name]
87
- raise ArgumentError, "Option :id must be present" unless options[:id]
88
- name = options.delete(:name)
89
- connection.post("/data/#{name}", options)
90
-
20
+ def self.get(name)
21
+ connection.data_bag(name)
91
22
  end
92
23
 
93
- # Update a data bag item
94
- #
95
- # @example
96
- # Spice::DataBag.update_item(:name => "users", :id => "adam", :title => "Supreme Awesomer")
97
- #
98
- # @param [Hash] options the options hash from which to update a data bag
99
- # @option options [String] :name The name of your data bag
100
- # @option options [String] :id The id of the data bag item
101
- #
102
- # Any additional keys in the options hash will be used as attributes
103
- # to be stored in the data bag item
104
-
105
- def self.update_item(options={})
106
- raise ArgumentError, "Option :name must be present" unless options[:name]
107
- raise ArgumentError, "Option :id must be present" unless options[:id]
108
- name = options.delete(:name)
109
- id = options.delete(:id)
110
- connection.put("/data/#{name}/#{id}", options)
111
- end
112
-
113
- # Delete a data bag item
114
- #
115
- # @example
116
- # Spice::DataBag.delete_item(:name => "users", :id => "adam")
117
- #
118
- # @param [Hash] options the options hash from which to delete a data bag
119
- # @option options [String] :name The name of your data bag
120
- # @option options [String] :id The id of the data bag item
121
- #
122
-
123
- def self.delete_item(options={})
124
- raise ArgumentError, "Option :name must be present" unless options[:name]
125
- raise ArgumentError, "Option :id must be present" unless options[:id]
126
- name = options.delete(:name)
127
- id = options.delete(:id)
128
- connection.delete("/data/#{name}/#{id}", options)
129
-
24
+ def do_post
25
+ response = connection.post("/data", attributes)
130
26
  end
131
27
  end
132
28
  end
@@ -0,0 +1,35 @@
1
+ module Spice
2
+ class DataBagItem
3
+ include Toy::Store
4
+ include Spice::Persistence
5
+ extend Spice::Persistence
6
+ store :memory, {}
7
+ endpoint "data"
8
+
9
+ attribute :_id, String
10
+ attribute :data, Hash, :default => {}
11
+ attribute :name, String
12
+
13
+ validates_presence_of :_id, :name, :data
14
+
15
+ def self.get(name, id)
16
+ connection.data_bag_item(name, id)
17
+ end
18
+
19
+ def do_post
20
+ attrs = data.dup
21
+ attrs['id'] = attributes['_id']
22
+ connection.post("/data/#{name}", attrs)
23
+ end
24
+
25
+ def do_put
26
+ attrs = data.dup
27
+ attrs['id'] = attributes['_id']
28
+ connection.put("/data/#{name}/#{_id}", attrs)
29
+ end
30
+
31
+ def do_delete
32
+ connection.delete("/data/#{name}/#{_id}")
33
+ end
34
+ end
35
+ end
@@ -1,85 +1,21 @@
1
- module Spice
2
- class Environment < Spice::Chef
3
- # Get a list of all data bags in the following syntax
4
- # Spice::Environment.all
5
- #
6
- # @param [Hash] options the options hash. Currently does nothing
7
- def self.all(options={})
8
- connection.get("/environments")
9
- end
10
-
11
- # An alternative format for showing the contents of a data bag
12
- # @example Retrieve the id and uri of items in a data bag called "users"
13
- # Spice::Environment["users"] # => {"adam":"http://localhost:4000/data/users/adam"}
14
- def self.[](name)
15
- connection.get("/environments/#{name}")
16
- end
17
-
18
- # Show the contents of a data bag
19
- # @example Retrieve the id and uri of items in a data bag called "users"
20
- # Spice::Environment.show(:name => "users") # => {"adam":"http://localhost:4000/data/users/adam"}
21
- #
22
- # @param [Hash] options The options hash
23
- # @option options [String] :name The name of your data bag
24
- def self.show(options={})
25
- raise ArgumentError, "Option :name must be present" unless options[:name]
26
- name = options.delete(:name)
27
- connection.get("/environments/#{name}")
28
- end
29
-
30
- # Create a a new data bag
31
- #
32
- # @example
33
- # Spice::Environment.create(:name => "users")
34
- #
35
- # @param [Hash] options the options hash from which to create a data bag
36
- # @option options [String] :name The name of your data bag
37
-
38
- def self.create(options={})
39
- options[:chef_type] ||= "environment"
40
- options[:json_class] ||= "Chef::Environment"
41
- options[:attributes] ||= {}
42
- options[:description] ||= ""
43
- options[:cookbook_versions] ||= {}
44
- connection.post("/environments", options)
45
- end
46
-
47
- # Delete a data bag
48
- #
49
- # @example
50
- # Spice::Environment.delete(:name => "users")
51
- #
52
- # @param [Hash] options the options hash from which to delete a data bag
53
- # @option options [String] :name The name of your data bag
1
+ require 'spice/persistence'
54
2
 
55
- def self.delete(options={})
56
- raise ArgumentError, "Option :name must be present" unless options[:name]
57
- name = options.delete(:name)
58
- connection.delete("/environments/#{name}", options)
59
- end
60
-
61
- # Shows a data bag item
62
- #
63
- # @example
64
- # Spice::Environment.show_item(:name => "users", :id => "adam")
65
- #
66
- # @param [Hash] options the options hash from which to create a data bag
67
- # @option options [String] :name The name of your data bag
68
- # @option options [String] :id The id of the data bag item
3
+ module Spice
4
+ class Environment
5
+ include Toy::Store
6
+ include Spice::Persistence
7
+ extend Spice::Persistence
8
+ store :memory, {}
9
+ endpoint "environments"
69
10
 
70
- def self.show_cookbook(options={})
71
- raise ArgumentError, "Option :name must be present" unless options[:name]
72
- raise ArgumentError, "Option :cookbook must be present" unless options[:cookbook]
73
- name = options.delete(:name)
74
- cookbook = options.delete(:cookbook)
75
- connection.get("/environments/#{name}/cookbooks/#{cookbook}", options)
76
- end
11
+ attribute :name, String
12
+ attribute :description, String
13
+ attribute :attrs, Hash, :default => {}
14
+ attribute :json_class, String, :default => "Chef::Environment"
15
+ attribute :chef_type, String, :default => "environment"
16
+ attribute :cookbook_versions, Hash, :default => {}
77
17
 
78
- def self.list_cookbooks(options={})
79
- raise ArgumentError, "Option :name must be present" unless options[:name]
80
- name = options.delete(:name)
81
- connection.get("/environments/#{name}/cookbooks", options)
82
- end
18
+ validates_presence_of :name, :description
83
19
 
84
20
  end
85
21
  end
@@ -0,0 +1,30 @@
1
+ module Spice
2
+ class Error < StandardError
3
+ attr_reader :http_headers
4
+
5
+ def initialize(message, http_headers)
6
+ @http_headers = Hash[http_headers]
7
+ super(message)
8
+ end
9
+
10
+ end
11
+
12
+ class BadRequest < Error
13
+ end
14
+
15
+ class Unauthorized < Error
16
+ end
17
+
18
+ class Forbidden < Error
19
+ end
20
+
21
+ class NotFound < Error
22
+ end
23
+
24
+ class NotAcceptable < Error
25
+ end
26
+
27
+ class Conflict < Error
28
+ end
29
+
30
+ end
@@ -1,40 +1,23 @@
1
+ require 'spice/persistence'
2
+
1
3
  module Spice
2
- class Node < Spice::Chef
3
- def self.all(options={})
4
- connection.get("/nodes")
5
- end
4
+ class Node
5
+ include Toy::Store
6
+ include Spice::Persistence
7
+ extend Spice::Persistence
8
+ store :memory, {}
9
+ endpoint "nodes"
6
10
 
7
- def self.[](name)
8
- connection.get("/nodes/#{name}")
9
- end
10
-
11
- def self.show(options={})
12
- raise ArgumentError, "Option :name must be present" unless options[:name]
13
- name = options.delete(:name)
14
- connection.get("/nodes/#{name}")
15
- end
16
-
17
- def self.create(options={})
18
- raise ArgumentError, "Option :name must be present" unless options[:name]
19
- options[:chef_type] ||= "node"
20
- options[:json_class] ||= "Chef::Node"
21
- options[:attributes] ||= {}
22
- options[:overrides] ||= {}
23
- options[:defaults] ||={}
24
- options[:run_list] ||= []
25
- connection.post("/nodes", options)
26
- end
27
-
28
- def self.update(options={})
29
- raise ArgumentError, "Option :name must be present" unless options[:name]
30
- name = options.delete(:name)
31
- connection.put("/nodes/#{name}", options)
32
- end
33
-
34
- def self.delete(options={})
35
- raise ArgumentError, "Option :name must be present" unless options[:name]
36
- name = options.delete(:name)
37
- connection.delete("/nodes/#{name}", options)
38
- end
11
+ attribute :name, String
12
+ attribute :chef_type, String, :default => "node"
13
+ attribute :json_class, String, :default => "Chef::Node"
14
+ attribute :normal, Hash, :default => {}
15
+ attribute :override, Hash, :default => {}
16
+ attribute :default, Hash, :default => {}
17
+ attribute :automatic, Hash, :default => {}
18
+ attribute :run_list, Array, :default => []
19
+
20
+ validates_presence_of :name
21
+
39
22
  end
40
23
  end
@@ -0,0 +1,42 @@
1
+ module Spice
2
+ module Persistence
3
+ def self.included(base)
4
+ base.after_create :do_post
5
+ base.after_update :do_put
6
+ base.after_destroy :do_delete
7
+ end
8
+
9
+ def endpoint(ep=nil)
10
+ @endpoint = ep if !ep.nil?
11
+ @endpoint
12
+ end
13
+
14
+ def all(options={})
15
+ connection.send(endpoint, options)
16
+ end
17
+
18
+ def get(options)
19
+ connection.send(endpoint, options).first
20
+ end
21
+
22
+ def connection
23
+ Spice.connection
24
+ end
25
+
26
+ def do_post
27
+ response = connection.post("/#{self.class.endpoint}", attributes)
28
+ update_attributes(response.body)
29
+ response = connection.get("/#{self.class.endpoint}/#{name}")
30
+ update_attributes(response.body)
31
+ end
32
+
33
+ def do_put
34
+ connection.put("/#{self.class.endpoint}/#{name}", attributes)
35
+ end
36
+
37
+ def do_delete
38
+ connection.delete("/#{self.class.endpoint}/#{name}")
39
+ end
40
+
41
+ end
42
+ end