berkflow 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -0
- data/Gemfile +0 -3
- data/README.md +25 -2
- data/berkflow.gemspec +3 -3
- data/lib/berkflow/cli.rb +121 -2
- data/lib/berkflow/version.rb +1 -1
- metadata +9 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e954e4cef8846390031564211f9bba01b4e25ce
|
4
|
+
data.tar.gz: ea5d4db34fb05fb4a712c0cbc94b03b8fd218282
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a243d317a138e9444a104a68f8835f327a6a6dc3ec14834647d2699c1d0e5bbe58dd64d75fa8471097835090e031d05ff982c6a7a8388fe72d7a94541eac8333
|
7
|
+
data.tar.gz: 94ec93024b61cc6f9a14bba043fe2f7a989de28e0bf18b1e00fc6f0b6d7659b400539da04041eb44ccb4a4eae121d5f79afc4a55c5e78b6d8c0dcdea7e2015d6
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# 0.2.0
|
2
|
+
|
3
|
+
* Features
|
4
|
+
* `blo install` command - installs a package generated by `berks package` into your configured Chef Server
|
5
|
+
|
6
|
+
* Enhancements
|
7
|
+
* Support `latest` as a version number in upgrade. This will upgrade the environment to the latest version of the given cookbook
|
8
|
+
* Leaving the version blank in upgrade will upgrade the environment to the latest version
|
9
|
+
* Upgrade won't occur if the environment is already at the given version. Override with the `--force` flag
|
10
|
+
* `blo install` aliased to `blo in`
|
11
|
+
* `blo upgrade` aliased to `blo up`
|
12
|
+
|
13
|
+
* Bug Fixes
|
14
|
+
* Now possible to install from the generated Gemfile. Previously was using many unreleased gems and dependencies.
|
15
|
+
|
16
|
+
# 0.1.0
|
17
|
+
|
18
|
+
Initial release
|
19
|
+
|
20
|
+
* Features
|
21
|
+
* `blo upgrade` command - upgrade an existing Chef Environment to the given cookbook version
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -14,7 +14,7 @@ A command line tool for managing Chef Environments using Berkshelf and the [Envi
|
|
14
14
|
|
15
15
|
### Upgrading a Chef Environment
|
16
16
|
|
17
|
-
Berkflow exposes a command for configuring a Chef Environment and running Chef Client on all nodes in that environment.
|
17
|
+
Berkflow exposes a command for configuring a Chef Environment to a specific Environment Cookbook version and running Chef Client on all nodes in that environment.
|
18
18
|
|
19
19
|
$ blo upgrade myface-dev myface 1.2.3
|
20
20
|
Applying cookbook locks to myface-dev...
|
@@ -23,6 +23,14 @@ Berkflow exposes a command for configuring a Chef Environment and running Chef C
|
|
23
23
|
Successfully ran Chef Client on 10 nodes
|
24
24
|
Done. See berkflow_out/20140331172904 for logs.
|
25
25
|
|
26
|
+
You can also upgrade to the latest version of the cookbook found on the Chef Server by passing `latest`
|
27
|
+
|
28
|
+
$ blo upgrade myface-dev myface latest
|
29
|
+
|
30
|
+
or simply leaving the version blank
|
31
|
+
|
32
|
+
$ blo upgrade myface-dev myface
|
33
|
+
|
26
34
|
Your Chef Server must meet the following requirements:
|
27
35
|
|
28
36
|
* The `myface-dev` environment must exist
|
@@ -57,9 +65,24 @@ Shell commands executed with `blo exec` are by default not run with sudo. Use th
|
|
57
65
|
|
58
66
|
$ blo exec myface-dev "ls -lah" --sudo
|
59
67
|
|
68
|
+
### Installing Berkshelf packages into a Chef server
|
69
|
+
|
70
|
+
Packages generated by `berks package` can be easily installed into a Chef Server with Berkflow.
|
71
|
+
|
72
|
+
$ blo install https://github.com/berkshelf/berkshelf-cookbook/releases/download/v0.3.1/cookbooks.tar.gz
|
73
|
+
|
74
|
+
It works with filepaths, too
|
75
|
+
|
76
|
+
$ blo install cookbooks.tar.gz
|
77
|
+
|
78
|
+
Installing a package will upload and freeze each cookbook into your configured Chef Server. Already frozen cookbooks
|
79
|
+
will be skipped unless you specify the --force flag.
|
80
|
+
|
81
|
+
$ blo install cookbooks.tar.gz --force
|
82
|
+
|
60
83
|
## Contributing
|
61
84
|
|
62
|
-
1. Fork it ( https://github.com/
|
85
|
+
1. Fork it ( https://github.com/reset/berkflow/fork )
|
63
86
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
64
87
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
65
88
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/berkflow.gemspec
CHANGED
@@ -19,9 +19,9 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_dependency "solve"
|
22
|
-
spec.add_dependency "berkshelf",
|
23
|
-
spec.add_dependency "ridley",
|
24
|
-
spec.add_dependency "ridley-connectors", "~>
|
22
|
+
spec.add_dependency "berkshelf", "~> 3.0.0.beta8"
|
23
|
+
spec.add_dependency "ridley", "~> 3.0.0.rc1"
|
24
|
+
spec.add_dependency "ridley-connectors", "~> 2.0.0.rc1"
|
25
25
|
spec.add_dependency "thor", "~> 0.18"
|
26
26
|
|
27
27
|
spec.add_development_dependency "bundler", "~> 1.6"
|
data/lib/berkflow/cli.rb
CHANGED
@@ -18,6 +18,13 @@ module Berkflow
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
LATEST = "latest".freeze
|
22
|
+
|
23
|
+
namespace "berkflow"
|
24
|
+
|
25
|
+
map "up" => :upgrade
|
26
|
+
map "in" => :install
|
27
|
+
|
21
28
|
class_option :verbose,
|
22
29
|
type: :boolean,
|
23
30
|
desc: "Output verbose information",
|
@@ -44,6 +51,86 @@ module Berkflow
|
|
44
51
|
aliases: "-P",
|
45
52
|
default: nil
|
46
53
|
|
54
|
+
method_option :force,
|
55
|
+
type: :boolean,
|
56
|
+
aliases: "-f",
|
57
|
+
desc: "Upload cookbooks even if they are already present and frozen.",
|
58
|
+
default: false
|
59
|
+
desc "install URL", "install Berkshelf package into the Chef Server."
|
60
|
+
def install(url)
|
61
|
+
require 'uri'
|
62
|
+
require 'open-uri'
|
63
|
+
require 'zlib'
|
64
|
+
require 'rubygems/package'
|
65
|
+
|
66
|
+
if is_url?(url)
|
67
|
+
tempfile = Tempfile.new("berkflow")
|
68
|
+
begin
|
69
|
+
open(url) { |remote_file| tempfile.write(remote_file.read) }
|
70
|
+
rescue OpenURI::HTTPError => ex
|
71
|
+
error "Error retrieving remote package: #{ex.message}."
|
72
|
+
exit(1)
|
73
|
+
end
|
74
|
+
url = tempfile.path
|
75
|
+
end
|
76
|
+
|
77
|
+
unless File.exist?(url)
|
78
|
+
error "Package not found: #{url}."
|
79
|
+
exit(1)
|
80
|
+
end
|
81
|
+
|
82
|
+
tmpdir = Dir.mktmpdir("berkflow")
|
83
|
+
|
84
|
+
begin
|
85
|
+
zlib = Zlib::GzipReader.new(File.open(url, "rb"))
|
86
|
+
io = StringIO.new(zlib.read)
|
87
|
+
zlib.close
|
88
|
+
|
89
|
+
Gem::Package::TarReader.new io do |tar|
|
90
|
+
tar.each do |tarfile|
|
91
|
+
destination_file = File.join(tmpdir, tarfile.full_name)
|
92
|
+
|
93
|
+
if tarfile.directory?
|
94
|
+
FileUtils.mkdir_p(destination_file)
|
95
|
+
else
|
96
|
+
destination_directory = File.dirname(destination_file)
|
97
|
+
FileUtils.mkdir_p(destination_directory) unless File.directory?(destination_directory)
|
98
|
+
File.open(destination_file, "wb") { |f| f.print tarfile.read }
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
rescue Zlib::GzipFile::Error => ex
|
103
|
+
error "Error extracting package: #{ex.message}"
|
104
|
+
exit(1)
|
105
|
+
end
|
106
|
+
|
107
|
+
cookbooks_dir = File.join(tmpdir, "cookbooks")
|
108
|
+
|
109
|
+
unless File.exist?(cookbooks_dir)
|
110
|
+
error "Package did not contain a 'cookbooks' directory."
|
111
|
+
exit(1)
|
112
|
+
end
|
113
|
+
|
114
|
+
uploaded = Dir.entries(cookbooks_dir).collect do |path|
|
115
|
+
path = File.join(cookbooks_dir, path)
|
116
|
+
next unless File.cookbook?(path)
|
117
|
+
begin
|
118
|
+
cookbook = Ridley::Chef::Cookbook.from_path(path)
|
119
|
+
say "Uploading #{cookbook.cookbook_name} (#{cookbook.version})"
|
120
|
+
ridley.cookbook.upload(path, freeze: true, force: options[:force])
|
121
|
+
true
|
122
|
+
rescue Ridley::Errors::FrozenCookbook
|
123
|
+
true
|
124
|
+
end
|
125
|
+
end.compact
|
126
|
+
|
127
|
+
say "Uploaded #{uploaded.length} cookbooks."
|
128
|
+
say "Done."
|
129
|
+
ensure
|
130
|
+
tempfile.close(true) if tempfile
|
131
|
+
FileUtils.rm_rf(tmpdir) if tmpdir
|
132
|
+
end
|
133
|
+
|
47
134
|
method_option :sudo,
|
48
135
|
type: :boolean,
|
49
136
|
desc: "Execute with sudo",
|
@@ -102,12 +189,31 @@ module Berkflow
|
|
102
189
|
failures.empty? ? exit(0) : exit(1)
|
103
190
|
end
|
104
191
|
|
105
|
-
|
106
|
-
|
192
|
+
method_option :force,
|
193
|
+
type: :boolean,
|
194
|
+
aliases: "-f",
|
195
|
+
desc: "Upgrade an environment even if it's already at the given version.",
|
196
|
+
default: false
|
197
|
+
desc "upgrade ENV APP [VERSION]", "upgrade an environment to the specified cookbook version."
|
198
|
+
long_desc <<-EOH
|
199
|
+
Upgrades an environment to the specified cookbook version. If no version is given then the latest
|
200
|
+
version of the cookbook found on the Chef Server will be used.
|
201
|
+
EOH
|
202
|
+
def upgrade(environment, application, version = LATEST)
|
107
203
|
version = sanitize_version(version)
|
108
204
|
env = find_environment!(environment)
|
109
205
|
cookbook = find_cookbook!(application, version)
|
110
206
|
|
207
|
+
unless options[:force]
|
208
|
+
if locked = env.cookbook_versions[application]
|
209
|
+
if Solve::Constraint.new(locked).version.to_s == cookbook.version
|
210
|
+
say "Environment already at #{cookbook.version}."
|
211
|
+
say "Done."
|
212
|
+
exit(0)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
111
217
|
file = Tempfile.new("berkflow")
|
112
218
|
unless contents = cookbook.download_file(:root_file, Berkshelf::Lockfile::DEFAULT_FILENAME, file.path)
|
113
219
|
error "#{application} (#{version}) did not contain a Berksfile.lock"
|
@@ -158,13 +264,26 @@ module Berkflow
|
|
158
264
|
end
|
159
265
|
|
160
266
|
def sanitize_version(version)
|
267
|
+
return version if version == LATEST
|
268
|
+
|
161
269
|
Solve::Version.new(version).to_s
|
162
270
|
rescue Solve::Errors::InvalidVersionFormat
|
163
271
|
error "Invalid version: #{version}. Provide a valid SemVer version string. (i.e. 1.2.3)."
|
164
272
|
exit(1)
|
165
273
|
end
|
166
274
|
|
275
|
+
def is_url?(string)
|
276
|
+
string =~ /^#{URI::regexp}$/
|
277
|
+
end
|
278
|
+
|
167
279
|
def find_cookbook!(application, version)
|
280
|
+
if version == LATEST
|
281
|
+
unless version = ridley.cookbook.latest_version(application)
|
282
|
+
error "No versions of Cookbook found: #{application}."
|
283
|
+
exit(1)
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
168
287
|
unless cookbook = ridley.cookbook.find(application, version)
|
169
288
|
error "Cookbook not found: #{application} (#{version})."
|
170
289
|
exit(1)
|
data/lib/berkflow/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: berkflow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie Winsor
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: solve
|
@@ -30,42 +30,42 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 3.0.0.
|
33
|
+
version: 3.0.0.beta8
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 3.0.0.
|
40
|
+
version: 3.0.0.beta8
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: ridley
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 3.0.0.rc1
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 3.0.0.rc1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: ridley-connectors
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 2.0.0.rc1
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 2.0.0.rc1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: thor
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -118,8 +118,8 @@ extensions: []
|
|
118
118
|
extra_rdoc_files: []
|
119
119
|
files:
|
120
120
|
- .gitignore
|
121
|
+
- CHANGELOG.md
|
121
122
|
- Gemfile
|
122
|
-
- Gemfile.lock
|
123
123
|
- LICENSE
|
124
124
|
- README.md
|
125
125
|
- Rakefile
|
@@ -153,4 +153,3 @@ signing_key:
|
|
153
153
|
specification_version: 4
|
154
154
|
summary: A Cookbook-Centric Deployment workflow tool
|
155
155
|
test_files: []
|
156
|
-
has_rdoc:
|