ridley 0.8.6 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +0 -4
- data/lib/ridley/chef/cookbook/syntax_check.rb +7 -19
- data/lib/ridley/chef/cookbook.rb +9 -5
- data/lib/ridley/errors.rb +2 -0
- data/lib/ridley/resources/cookbook_resource.rb +28 -19
- data/lib/ridley/version.rb +1 -1
- data/spec/unit/ridley/chef/cookbook_spec.rb +8 -0
- data/spec/unit/ridley/resources/cookbook_resource_spec.rb +10 -1
- metadata +3 -3
data/.travis.yml
CHANGED
@@ -12,9 +12,9 @@ module Ridley::Chef
|
|
12
12
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
13
13
|
# you may not use this file except in compliance with the License.
|
14
14
|
# You may obtain a copy of the License at
|
15
|
-
#
|
15
|
+
#
|
16
16
|
# http://www.apache.org/licenses/LICENSE-2.0
|
17
|
-
#
|
17
|
+
#
|
18
18
|
# Unless required by applicable law or agreed to in writing, software
|
19
19
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
20
20
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
@@ -91,13 +91,7 @@ module Ridley::Chef
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def untested_ruby_files
|
94
|
-
ruby_files.reject
|
95
|
-
if validated?(file)
|
96
|
-
true
|
97
|
-
else
|
98
|
-
false
|
99
|
-
end
|
100
|
-
end
|
94
|
+
ruby_files.reject { |file| validated?(file) }
|
101
95
|
end
|
102
96
|
|
103
97
|
def template_files
|
@@ -105,13 +99,7 @@ module Ridley::Chef
|
|
105
99
|
end
|
106
100
|
|
107
101
|
def untested_template_files
|
108
|
-
template_files.reject
|
109
|
-
if validated?(file)
|
110
|
-
true
|
111
|
-
else
|
112
|
-
false
|
113
|
-
end
|
114
|
-
end
|
102
|
+
template_files.reject { |file| validated?(file) }
|
115
103
|
end
|
116
104
|
|
117
105
|
def validated?(file)
|
@@ -137,18 +125,18 @@ module Ridley::Chef
|
|
137
125
|
end
|
138
126
|
|
139
127
|
def validate_template(erb_file)
|
140
|
-
result = shell_out("erubis -x #{erb_file} | ruby -c")
|
128
|
+
result = quietly { shell_out("erubis -x #{erb_file} | ruby -c") }
|
141
129
|
result.error!
|
142
130
|
true
|
143
131
|
rescue Mixlib::ShellOut::ShellCommandFailed
|
144
132
|
file_relative_path = erb_file[/^#{Regexp.escape(cookbook_path+File::Separator)}(.*)/, 1]
|
145
133
|
log.error { "Erb template #{file_relative_path} has a syntax error:" }
|
146
|
-
result.stderr.each_line { |l| Ridley.log
|
134
|
+
result.stderr.each_line { |l| Ridley.log.fatal(l.chomp) }
|
147
135
|
false
|
148
136
|
end
|
149
137
|
|
150
138
|
def validate_ruby_file(ruby_file)
|
151
|
-
result = shell_out("ruby -c #{ruby_file}")
|
139
|
+
result = quietly { shell_out("ruby -c #{ruby_file}") }
|
152
140
|
result.error!
|
153
141
|
true
|
154
142
|
rescue Mixlib::ShellOut::ShellCommandFailed
|
data/lib/ridley/chef/cookbook.rb
CHANGED
@@ -74,6 +74,9 @@ module Ridley::Chef
|
|
74
74
|
# }
|
75
75
|
attr_reader :manifest
|
76
76
|
|
77
|
+
# @return [Boolean]
|
78
|
+
attr_accessor :frozen
|
79
|
+
|
77
80
|
def_delegator :@metadata, :version
|
78
81
|
|
79
82
|
def initialize(name, path, metadata)
|
@@ -92,6 +95,7 @@ module Ridley::Chef
|
|
92
95
|
providers: Array.new,
|
93
96
|
root_files: Array.new
|
94
97
|
)
|
98
|
+
@frozen = false
|
95
99
|
|
96
100
|
load_files
|
97
101
|
end
|
@@ -166,11 +170,11 @@ module Ridley::Chef
|
|
166
170
|
def validate
|
167
171
|
raise IOError, "No Cookbook found at: #{path}" unless path.exist?
|
168
172
|
|
169
|
-
unless
|
170
|
-
raise Ridley::Errors::CookbookSyntaxError, "Invalid ruby files in cookbook: #{
|
173
|
+
unless syntax_checker.validate_ruby_files
|
174
|
+
raise Ridley::Errors::CookbookSyntaxError, "Invalid ruby files in cookbook: #{cookbook_name} (#{version})."
|
171
175
|
end
|
172
|
-
unless
|
173
|
-
raise Ridley::Errors::CookbookSyntaxError, "Invalid template files in cookbook: #{
|
176
|
+
unless syntax_checker.validate_templates
|
177
|
+
raise Ridley::Errors::CookbookSyntaxError, "Invalid template files in cookbook: #{cookbook_name} (#{version})."
|
174
178
|
end
|
175
179
|
|
176
180
|
true
|
@@ -183,13 +187,13 @@ module Ridley::Chef
|
|
183
187
|
result[:cookbook_name] = cookbook_name
|
184
188
|
result[:version] = version
|
185
189
|
result[:metadata] = metadata
|
190
|
+
result[:frozen?] = frozen
|
186
191
|
result.to_hash
|
187
192
|
end
|
188
193
|
|
189
194
|
def to_json(*args)
|
190
195
|
result = self.to_hash
|
191
196
|
result['json_class'] = CHEF_JSON_CLASS
|
192
|
-
result['frozen?'] = false
|
193
197
|
result.to_json(*args)
|
194
198
|
end
|
195
199
|
|
data/lib/ridley/errors.rb
CHANGED
@@ -29,10 +29,6 @@ module Ridley
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
def create(*args)
|
33
|
-
raise NotImplementedError
|
34
|
-
end
|
35
|
-
|
36
32
|
# Delete a cookbook of the given name and version on the remote Chef server
|
37
33
|
#
|
38
34
|
# @param [Ridley::Client] client
|
@@ -140,15 +136,12 @@ module Ridley
|
|
140
136
|
nil
|
141
137
|
end
|
142
138
|
|
143
|
-
#
|
139
|
+
# Update or create a new Cookbook Version of the given name, version with the
|
144
140
|
# given manifest of files and checksums.
|
145
141
|
#
|
146
142
|
# @param [Ridley::Client] client
|
147
|
-
# @param [
|
148
|
-
#
|
149
|
-
# @param [String] manifest
|
150
|
-
# a JSON blob containing file names, file paths, and checksums for each
|
151
|
-
# that describe the cookbook version being uploaded.
|
143
|
+
# @param [Ridley::Chef::Cookbook] cookbook
|
144
|
+
# the cookbook to save
|
152
145
|
#
|
153
146
|
# @option options [Boolean] :force
|
154
147
|
# Upload the Cookbook even if the version already exists and is frozen on
|
@@ -157,19 +150,25 @@ module Ridley
|
|
157
150
|
# Freeze the uploaded Cookbook on the Chef Server so that it cannot be
|
158
151
|
# overwritten
|
159
152
|
#
|
153
|
+
# @raise [Ridley::Errors::FrozenCookbook]
|
154
|
+
# if a cookbook of the same name and version already exists on the remote Chef server
|
155
|
+
# and is frozen. If the :force option is provided the given cookbook will be saved
|
156
|
+
# regardless.
|
157
|
+
#
|
160
158
|
# @return [Hash]
|
161
|
-
def
|
159
|
+
def update(client, cookbook, options = {})
|
162
160
|
options.reverse_merge(force: false, freeze: false)
|
163
161
|
|
164
|
-
|
165
|
-
url << "?force=true" if options[:force]
|
162
|
+
cookbook.frozen = options[:freeze]
|
166
163
|
|
167
|
-
|
168
|
-
|
164
|
+
url = "cookbooks/#{cookbook.cookbook_name}/#{cookbook.version}"
|
165
|
+
url << "?force=true" if options[:force]
|
169
166
|
|
170
|
-
|
171
|
-
|
167
|
+
client.connection.put(url, cookbook.to_json)
|
168
|
+
rescue Ridley::Errors::HTTPConflict => ex
|
169
|
+
raise Ridley::Errors::FrozenCookbook, ex
|
172
170
|
end
|
171
|
+
alias_method :create, :update
|
173
172
|
|
174
173
|
# Uploads a cookbook to the remote Chef server from the contents of a filepath
|
175
174
|
#
|
@@ -195,17 +194,24 @@ module Ridley
|
|
195
194
|
options = options.reverse_merge(validate: true, force: false, freeze: false)
|
196
195
|
cookbook = Ridley::Chef::Cookbook.from_path(path, options.slice(:name))
|
197
196
|
|
197
|
+
unless (existing = find(client, cookbook.cookbook_name, cookbook.version)).nil?
|
198
|
+
if existing.frozen? && options[:force] == false
|
199
|
+
msg = "The cookbook #{cookbook.cookbook_name} (#{cookbook.version}) already exists and is"
|
200
|
+
msg << " frozen on the Chef server. Use the 'force' option to override."
|
201
|
+
raise Ridley::Errors::FrozenCookbook, msg
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
198
205
|
if options[:validate]
|
199
206
|
cookbook.validate
|
200
207
|
end
|
201
208
|
|
202
|
-
name = options[:name] || cookbook.name
|
203
209
|
checksums = cookbook.checksums.dup
|
204
210
|
sandbox = client.sandbox.create(checksums.keys)
|
205
211
|
|
206
212
|
sandbox.upload(checksums)
|
207
213
|
sandbox.commit
|
208
|
-
|
214
|
+
update(client, cookbook, options.slice(:force, :freeze))
|
209
215
|
end
|
210
216
|
|
211
217
|
# Return a list of versions for the given cookbook present on the remote Chef server
|
@@ -293,6 +299,9 @@ module Ridley
|
|
293
299
|
attribute :version,
|
294
300
|
type: String
|
295
301
|
|
302
|
+
attribute :frozen?,
|
303
|
+
type: Boolean
|
304
|
+
|
296
305
|
# Download the entire cookbook
|
297
306
|
#
|
298
307
|
# @param [String] destination (Dir.mktmpdir)
|
data/lib/ridley/version.rb
CHANGED
@@ -150,6 +150,10 @@ describe Ridley::Chef::Cookbook do
|
|
150
150
|
describe "#to_hash" do
|
151
151
|
subject { cookbook.to_hash }
|
152
152
|
|
153
|
+
it "has a :frozen? flag" do
|
154
|
+
subject.should have_key(:frozen?)
|
155
|
+
end
|
156
|
+
|
153
157
|
it "has a :recipes key with a value of an Array Hashes" do
|
154
158
|
subject.should have_key(:recipes)
|
155
159
|
subject[:recipes].should be_a(Array)
|
@@ -408,5 +412,9 @@ describe Ridley::Chef::Cookbook do
|
|
408
412
|
@json.should have_json_path('json_class')
|
409
413
|
parse_json(@json)['json_class'].should eql(Ridley::Chef::Cookbook::CHEF_JSON_CLASS)
|
410
414
|
end
|
415
|
+
|
416
|
+
it "has a 'frozen?' flag" do
|
417
|
+
@json.should have_json_path('frozen?')
|
418
|
+
end
|
411
419
|
end
|
412
420
|
end
|
@@ -6,6 +6,7 @@ describe Ridley::CookbookResource do
|
|
6
6
|
subject { described_class.new(client) }
|
7
7
|
|
8
8
|
describe "ClassMethods" do
|
9
|
+
subject { described_class }
|
9
10
|
let(:server_url) { "https://api.opscode.com/organizations/vialstudios" }
|
10
11
|
let(:client_name) { "reset" }
|
11
12
|
let(:client_key) { fixtures_path.join("reset.pem") }
|
@@ -132,7 +133,7 @@ describe Ridley::CookbookResource do
|
|
132
133
|
end
|
133
134
|
|
134
135
|
describe "::versions" do
|
135
|
-
let(:cookbook) { "artifact" }
|
136
|
+
let(:cookbook) { "artifact" }
|
136
137
|
subject { described_class.versions(client, cookbook) }
|
137
138
|
|
138
139
|
before(:each) do
|
@@ -169,6 +170,14 @@ describe Ridley::CookbookResource do
|
|
169
170
|
subject.should include("1.2.0")
|
170
171
|
end
|
171
172
|
end
|
173
|
+
|
174
|
+
describe "::upload" do
|
175
|
+
pending
|
176
|
+
end
|
177
|
+
|
178
|
+
describe "::update" do
|
179
|
+
pending
|
180
|
+
end
|
172
181
|
end
|
173
182
|
|
174
183
|
describe "#download" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ridley
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -401,7 +401,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
401
401
|
version: '0'
|
402
402
|
segments:
|
403
403
|
- 0
|
404
|
-
hash:
|
404
|
+
hash: 141649622166830890
|
405
405
|
requirements: []
|
406
406
|
rubyforge_project:
|
407
407
|
rubygems_version: 1.8.24
|