bosh_cli 0.19.6 → 1.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/bosh +3 -0
- data/lib/cli.rb +15 -5
- data/lib/cli/{commands/base.rb → base_command.rb} +38 -44
- data/lib/cli/command_discovery.rb +40 -0
- data/lib/cli/command_handler.rb +135 -0
- data/lib/cli/commands/biff.rb +16 -12
- data/lib/cli/commands/blob_management.rb +10 -3
- data/lib/cli/commands/cloudcheck.rb +13 -11
- data/lib/cli/commands/complete.rb +29 -0
- data/lib/cli/commands/deployment.rb +137 -28
- data/lib/cli/commands/help.rb +96 -0
- data/lib/cli/commands/job.rb +4 -1
- data/lib/cli/commands/job_management.rb +36 -23
- data/lib/cli/commands/job_rename.rb +11 -12
- data/lib/cli/commands/log_management.rb +28 -32
- data/lib/cli/commands/maintenance.rb +6 -1
- data/lib/cli/commands/misc.rb +129 -87
- data/lib/cli/commands/package.rb +6 -65
- data/lib/cli/commands/property_management.rb +20 -8
- data/lib/cli/commands/release.rb +211 -206
- data/lib/cli/commands/ssh.rb +178 -188
- data/lib/cli/commands/stemcell.rb +114 -51
- data/lib/cli/commands/task.rb +74 -56
- data/lib/cli/commands/user.rb +6 -3
- data/lib/cli/commands/vms.rb +17 -15
- data/lib/cli/config.rb +27 -1
- data/lib/cli/core_ext.rb +27 -1
- data/lib/cli/deployment_helper.rb +47 -0
- data/lib/cli/director.rb +18 -9
- data/lib/cli/errors.rb +6 -0
- data/lib/cli/job_builder.rb +75 -23
- data/lib/cli/job_property_collection.rb +87 -0
- data/lib/cli/job_property_validator.rb +130 -0
- data/lib/cli/package_builder.rb +32 -5
- data/lib/cli/release.rb +2 -0
- data/lib/cli/release_builder.rb +9 -13
- data/lib/cli/release_compiler.rb +5 -34
- data/lib/cli/release_tarball.rb +4 -19
- data/lib/cli/runner.rb +118 -694
- data/lib/cli/version.rb +1 -1
- data/spec/assets/config/swift-hp/config/final.yml +6 -0
- data/spec/assets/config/swift-hp/config/private.yml +7 -0
- data/spec/assets/config/swift-rackspace/config/final.yml +6 -0
- data/spec/assets/config/swift-rackspace/config/private.yml +6 -0
- data/spec/spec_helper.rb +0 -5
- data/spec/unit/base_command_spec.rb +32 -37
- data/spec/unit/biff_spec.rb +11 -10
- data/spec/unit/cli_commands_spec.rb +96 -88
- data/spec/unit/core_ext_spec.rb +1 -1
- data/spec/unit/deployment_manifest_spec.rb +36 -0
- data/spec/unit/director_spec.rb +17 -3
- data/spec/unit/job_builder_spec.rb +2 -2
- data/spec/unit/job_property_collection_spec.rb +111 -0
- data/spec/unit/job_property_validator_spec.rb +7 -0
- data/spec/unit/job_rename_spec.rb +7 -6
- data/spec/unit/package_builder_spec.rb +2 -2
- data/spec/unit/release_builder_spec.rb +33 -0
- data/spec/unit/release_spec.rb +54 -0
- data/spec/unit/release_tarball_spec.rb +2 -7
- data/spec/unit/runner_spec.rb +1 -151
- data/spec/unit/ssh_spec.rb +15 -9
- metadata +41 -12
- data/lib/cli/command_definition.rb +0 -52
- data/lib/cli/templates/help_message.erb +0 -80
data/lib/cli/commands/package.rb
CHANGED
@@ -3,36 +3,8 @@
|
|
3
3
|
module Bosh::Cli::Command
|
4
4
|
class Package < Base
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
Dir[specs_glob].each do |spec|
|
10
|
-
create(spec)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def create(name_or_path)
|
15
|
-
if name_or_path == "--all"
|
16
|
-
redirect(:package, :create_all)
|
17
|
-
end
|
18
|
-
|
19
|
-
spec = read_spec(name_or_path)
|
20
|
-
|
21
|
-
unless spec.is_a?(Hash) && spec.has_key?("name") && spec.has_key?("files")
|
22
|
-
err("Sorry, '#{name_or_path}' doesn't look like a valid package spec")
|
23
|
-
end
|
24
|
-
|
25
|
-
package_name = spec["name"]
|
26
|
-
header("Found '#{package_name}' spec")
|
27
|
-
print_spec(spec)
|
28
|
-
header("Building package...")
|
29
|
-
|
30
|
-
builder = Bosh::Cli::PackageBuilder.new(spec, work_dir,
|
31
|
-
false, release.blobstore)
|
32
|
-
builder.build
|
33
|
-
builder
|
34
|
-
end
|
35
|
-
|
6
|
+
usage "generate package"
|
7
|
+
desc "Generate package template"
|
36
8
|
def generate(name)
|
37
9
|
check_if_release_dir
|
38
10
|
|
@@ -50,11 +22,13 @@ module Bosh::Cli::Command
|
|
50
22
|
FileUtils.mkdir_p(package_dir)
|
51
23
|
|
52
24
|
generate_file(package_dir, "packaging") do
|
53
|
-
"# abort script on any command that exit
|
25
|
+
"# abort script on any command that exit " +
|
26
|
+
"with a non zero value\nset -e\n"
|
54
27
|
end
|
55
28
|
|
56
29
|
generate_file(package_dir, "pre_packaging") do
|
57
|
-
"# abort script on any command that exit
|
30
|
+
"# abort script on any command that exit " +
|
31
|
+
"with a non zero value\nset -e\n"
|
58
32
|
end
|
59
33
|
|
60
34
|
generate_file(package_dir, "spec") do
|
@@ -75,38 +49,5 @@ module Bosh::Cli::Command
|
|
75
49
|
end
|
76
50
|
end
|
77
51
|
|
78
|
-
def print_spec(spec)
|
79
|
-
say("Package name: #{spec["name"]}")
|
80
|
-
say("Files:")
|
81
|
-
for file in spec["files"]
|
82
|
-
say(" - #{file}")
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def read_spec(name)
|
87
|
-
load_yaml_file(find_spec(name))
|
88
|
-
end
|
89
|
-
|
90
|
-
def find_spec(name)
|
91
|
-
if File.directory?(name)
|
92
|
-
spec_path = File.join(name, "spec")
|
93
|
-
if File.exists?(spec_path)
|
94
|
-
spec_path
|
95
|
-
else
|
96
|
-
err("Cannot find spec file in '#{name}' directory")
|
97
|
-
end
|
98
|
-
elsif File.file?(name)
|
99
|
-
name
|
100
|
-
else
|
101
|
-
package_dir = File.join(work_dir, "packages", name)
|
102
|
-
if File.directory?(package_dir)
|
103
|
-
find_spec(package_dir)
|
104
|
-
else
|
105
|
-
err("Cannot find package '#{name}' (tried '#{package_dir}')")
|
106
|
-
end
|
107
|
-
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
52
|
end
|
112
53
|
end
|
@@ -4,6 +4,9 @@ module Bosh::Cli::Command
|
|
4
4
|
class PropertyManagement < Base
|
5
5
|
include Bosh::Cli::DeploymentHelper
|
6
6
|
|
7
|
+
# bosh set property
|
8
|
+
usage "set property"
|
9
|
+
desc "Set deployment property"
|
7
10
|
def set(name, value)
|
8
11
|
prepare
|
9
12
|
show_header
|
@@ -23,10 +26,9 @@ module Bosh::Cli::Command
|
|
23
26
|
end
|
24
27
|
|
25
28
|
prompt = "Are you sure you want to set property" +
|
26
|
-
|
27
|
-
"(type yes to proceed): "
|
29
|
+
" `#{name.green}' to `#{format_property(value).green}'?"
|
28
30
|
|
29
|
-
|
31
|
+
unless confirmed?(prompt)
|
30
32
|
err("Canceled")
|
31
33
|
end
|
32
34
|
|
@@ -43,14 +45,17 @@ module Bosh::Cli::Command
|
|
43
45
|
end
|
44
46
|
end
|
45
47
|
|
48
|
+
# bosh unset property
|
49
|
+
usage "unset property"
|
50
|
+
desc "Unset deployment property"
|
46
51
|
def unset(name)
|
47
52
|
prepare
|
48
53
|
show_header
|
49
54
|
|
50
55
|
prompt = "Are you sure you want to unset property " +
|
51
|
-
|
56
|
+
"`#{name.green}'?"
|
52
57
|
|
53
|
-
|
58
|
+
unless confirmed?(prompt)
|
54
59
|
err("Canceled")
|
55
60
|
end
|
56
61
|
|
@@ -63,6 +68,9 @@ module Bosh::Cli::Command
|
|
63
68
|
end
|
64
69
|
end
|
65
70
|
|
71
|
+
# bosh get property
|
72
|
+
usage "get property"
|
73
|
+
desc "Get deployment property"
|
66
74
|
def get(name)
|
67
75
|
prepare
|
68
76
|
show_header
|
@@ -76,9 +84,13 @@ module Bosh::Cli::Command
|
|
76
84
|
end
|
77
85
|
end
|
78
86
|
|
79
|
-
|
87
|
+
# bosh properties
|
88
|
+
usage "properties"
|
89
|
+
desc "List deployment properties"
|
90
|
+
option "--terse", "easy to parse output"
|
91
|
+
def list
|
80
92
|
prepare
|
81
|
-
terse =
|
93
|
+
terse = options[:terse]
|
82
94
|
show_header unless terse
|
83
95
|
|
84
96
|
properties = director.list_properties(@deployment_name)
|
@@ -97,7 +109,7 @@ module Bosh::Cli::Command
|
|
97
109
|
else
|
98
110
|
if output.size > 0
|
99
111
|
properties_table = table do |t|
|
100
|
-
t.headings =
|
112
|
+
t.headings = %w(Name Value)
|
101
113
|
output.each { |row| t << [row[0], row[1].truncate(40)] }
|
102
114
|
end
|
103
115
|
say(properties_table)
|
data/lib/cli/commands/release.rb
CHANGED
@@ -7,21 +7,18 @@ module Bosh::Cli::Command
|
|
7
7
|
include Bosh::Cli::DependencyHelper
|
8
8
|
include Bosh::Cli::VersionCalc
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
16
|
-
git = options.include?("--git")
|
17
|
-
|
10
|
+
# bosh init release
|
11
|
+
usage "init release"
|
12
|
+
desc "Initialize release directory"
|
13
|
+
option "--git", "initialize git repository"
|
14
|
+
def init(base = nil)
|
18
15
|
if base
|
19
|
-
FileUtils.mkdir_p(base)
|
16
|
+
FileUtils.mkdir_p(base)
|
20
17
|
Dir.chdir(base)
|
21
18
|
end
|
22
19
|
|
23
20
|
err("Release already initialized") if in_release_dir?
|
24
|
-
git_init if git
|
21
|
+
git_init if options[:git]
|
25
22
|
|
26
23
|
%w[config jobs packages src blobs].each do |dir|
|
27
24
|
FileUtils.mkdir(dir)
|
@@ -35,55 +32,65 @@ module Bosh::Cli::Command
|
|
35
32
|
say("Release directory initialized".green)
|
36
33
|
end
|
37
34
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
35
|
+
# bosh create release
|
36
|
+
usage "create release"
|
37
|
+
desc "Create release (assumes current directory " +
|
38
|
+
"to be a release repository)"
|
39
|
+
option "--force", "bypass git dirty state check"
|
40
|
+
option "--final", "create final release"
|
41
|
+
option "--with-tarball", "create release tarball"
|
42
|
+
option "--dry-run", "stop before writing release manifest"
|
43
|
+
def create(manifest_file = nil)
|
44
|
+
check_if_release_dir
|
45
|
+
|
46
|
+
if manifest_file && File.file?(manifest_file)
|
47
|
+
release_filename = create_from_manifest(manifest_file)
|
42
48
|
else
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
.blobs
|
50
|
-
blobs
|
51
|
-
.dev_builds
|
52
|
-
.idea
|
53
|
-
.DS_Store
|
54
|
-
.final_builds/jobs/**/*.tgz
|
55
|
-
.final_builds/packages/**/*.tgz
|
56
|
-
*.swp
|
57
|
-
*~
|
58
|
-
*#
|
59
|
-
#*
|
60
|
-
EOS
|
61
|
-
end
|
49
|
+
release_filename = create_from_spec
|
50
|
+
end
|
51
|
+
|
52
|
+
if release_filename
|
53
|
+
release.latest_release_filename = release_filename
|
54
|
+
release.save_config
|
62
55
|
end
|
63
|
-
rescue Errno::ENOENT
|
64
|
-
say("Unable to run 'git init'".red)
|
65
56
|
end
|
66
57
|
|
67
|
-
|
58
|
+
# bosh verify release
|
59
|
+
usage "verify release"
|
60
|
+
desc "Verify release"
|
61
|
+
def verify(tarball_path)
|
68
62
|
tarball = Bosh::Cli::ReleaseTarball.new(tarball_path)
|
69
63
|
|
70
|
-
|
64
|
+
nl
|
65
|
+
say("Verifying release...")
|
71
66
|
tarball.validate
|
72
67
|
nl
|
73
68
|
|
74
69
|
if tarball.valid?
|
75
|
-
say("'
|
70
|
+
say("`#{tarball_path}' is a valid release".green)
|
76
71
|
else
|
77
|
-
say("
|
78
|
-
|
79
|
-
say("-
|
72
|
+
say("Validation errors:".red)
|
73
|
+
tarball.errors.each do |error|
|
74
|
+
say("- #{error}")
|
80
75
|
end
|
76
|
+
err("`#{tarball_path}' is not a valid release".red)
|
81
77
|
end
|
82
78
|
end
|
83
79
|
|
80
|
+
usage "upload release"
|
81
|
+
desc "Upload release"
|
82
|
+
option "--rebase",
|
83
|
+
"Rebases this release onto the latest version",
|
84
|
+
"known by director (discards local job/package",
|
85
|
+
"versions in favor of versions assigned by director)"
|
84
86
|
def upload(release_file = nil)
|
85
87
|
auth_required
|
86
88
|
|
89
|
+
upload_options = {
|
90
|
+
:rebase => options[:rebase],
|
91
|
+
:repack => true
|
92
|
+
}
|
93
|
+
|
87
94
|
if release_file.nil?
|
88
95
|
check_if_release_dir
|
89
96
|
release_file = release.latest_release_filename
|
@@ -98,18 +105,95 @@ module Bosh::Cli::Command
|
|
98
105
|
end
|
99
106
|
end
|
100
107
|
|
108
|
+
unless File.exist?(release_file)
|
109
|
+
err("Release file doesn't exist")
|
110
|
+
end
|
111
|
+
|
101
112
|
file_type = `file --mime-type -b '#{release_file}'`
|
102
113
|
|
103
114
|
if file_type =~ /text\/(plain|yaml)/
|
104
|
-
upload_manifest(release_file)
|
105
|
-
else
|
106
|
-
upload_tarball(release_file)
|
115
|
+
upload_manifest(release_file, upload_options)
|
116
|
+
else
|
117
|
+
upload_tarball(release_file, upload_options)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
usage "reset release"
|
122
|
+
desc "Reset dev release"
|
123
|
+
def reset
|
124
|
+
check_if_release_dir
|
125
|
+
|
126
|
+
say("Your dev release environment will be completely reset".red)
|
127
|
+
if confirmed?
|
128
|
+
say("Removing dev_builds index...")
|
129
|
+
FileUtils.rm_rf(".dev_builds")
|
130
|
+
say("Clearing dev name...")
|
131
|
+
release.dev_name = nil
|
132
|
+
release.save_config
|
133
|
+
say("Removing dev tarballs...")
|
134
|
+
FileUtils.rm_rf("dev_releases")
|
135
|
+
|
136
|
+
say("Release has been reset".green)
|
137
|
+
else
|
138
|
+
say("Canceled")
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
usage "releases"
|
143
|
+
desc "Show the list of available releases"
|
144
|
+
def list
|
145
|
+
auth_required
|
146
|
+
releases = director.list_releases.sort do |r1, r2|
|
147
|
+
r1["name"] <=> r2["name"]
|
148
|
+
end
|
149
|
+
|
150
|
+
err("No releases") if releases.empty?
|
151
|
+
|
152
|
+
releases_table = table do |t|
|
153
|
+
t.headings = "Name", "Versions"
|
154
|
+
releases.each do |r|
|
155
|
+
versions = r["versions"].sort do |v1, v2|
|
156
|
+
version_cmp(v1, v2)
|
157
|
+
end
|
158
|
+
|
159
|
+
t << [r["name"], versions.join(", ")]
|
160
|
+
end
|
107
161
|
end
|
162
|
+
|
163
|
+
nl
|
164
|
+
say(releases_table)
|
165
|
+
nl
|
166
|
+
say("Releases total: %d" % releases.size)
|
108
167
|
end
|
109
168
|
|
110
|
-
|
111
|
-
|
112
|
-
|
169
|
+
usage "delete release"
|
170
|
+
desc "Delete release (or a particular release version)"
|
171
|
+
option "--force", "ignore errors during deletion"
|
172
|
+
def delete(name, version = nil)
|
173
|
+
auth_required
|
174
|
+
force = !!options[:force]
|
175
|
+
|
176
|
+
desc = "#{name}"
|
177
|
+
desc << "/#{version}" if version
|
178
|
+
|
179
|
+
if force
|
180
|
+
say("Deleting `#{desc}' (FORCED DELETE, WILL IGNORE ERRORS)".red)
|
181
|
+
else
|
182
|
+
say("Deleting `#{desc}'".red)
|
183
|
+
end
|
184
|
+
|
185
|
+
if confirmed?
|
186
|
+
status, _ = director.delete_release(
|
187
|
+
name, :force => force, :version => version)
|
188
|
+
task_report(status, "Deleted `#{desc}'")
|
189
|
+
else
|
190
|
+
say("Canceled deleting release".green)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
protected
|
195
|
+
|
196
|
+
def upload_manifest(manifest_path, upload_options = {})
|
113
197
|
package_matches = match_remote_packages(File.read(manifest_path))
|
114
198
|
|
115
199
|
find_release_dir(manifest_path)
|
@@ -117,11 +201,8 @@ module Bosh::Cli::Command
|
|
117
201
|
blobstore = release.blobstore
|
118
202
|
tmpdir = Dir.mktmpdir
|
119
203
|
|
120
|
-
|
121
|
-
|
122
|
-
compiler =
|
123
|
-
Bosh::Cli::ReleaseCompiler.new(manifest_path, blobstore,
|
124
|
-
remote_release, package_matches)
|
204
|
+
compiler = Bosh::Cli::ReleaseCompiler.new(
|
205
|
+
manifest_path, blobstore, package_matches)
|
125
206
|
need_repack = true
|
126
207
|
|
127
208
|
unless compiler.exists?
|
@@ -129,13 +210,16 @@ module Bosh::Cli::Command
|
|
129
210
|
compiler.compile
|
130
211
|
need_repack = false
|
131
212
|
end
|
132
|
-
|
213
|
+
|
214
|
+
upload_options[:repack] = need_repack
|
215
|
+
upload_tarball(compiler.tarball_path, upload_options)
|
133
216
|
end
|
134
217
|
|
135
|
-
def upload_tarball(tarball_path,
|
218
|
+
def upload_tarball(tarball_path, upload_options = {})
|
136
219
|
tarball = Bosh::Cli::ReleaseTarball.new(tarball_path)
|
137
220
|
# Trying to repack release by default
|
138
|
-
repack
|
221
|
+
repack = upload_options[:repack]
|
222
|
+
rebase = upload_options[:rebase]
|
139
223
|
|
140
224
|
say("\nVerifying release...")
|
141
225
|
tarball.validate(:allow_sparse => true)
|
@@ -148,7 +232,7 @@ module Bosh::Cli::Command
|
|
148
232
|
begin
|
149
233
|
remote_release = get_remote_release(tarball.release_name) rescue nil
|
150
234
|
|
151
|
-
if remote_release &&
|
235
|
+
if remote_release && !rebase &&
|
152
236
|
remote_release["versions"].include?(tarball.version)
|
153
237
|
err("This release version has already been uploaded")
|
154
238
|
end
|
@@ -157,7 +241,7 @@ module Bosh::Cli::Command
|
|
157
241
|
package_matches = match_remote_packages(tarball.manifest)
|
158
242
|
|
159
243
|
say("Checking if can repack release for faster upload...")
|
160
|
-
repacked_path = tarball.repack(
|
244
|
+
repacked_path = tarball.repack(package_matches)
|
161
245
|
if repacked_path.nil?
|
162
246
|
say("Uploading the whole release".green)
|
163
247
|
else
|
@@ -171,49 +255,31 @@ module Bosh::Cli::Command
|
|
171
255
|
# a release info (think new releases)
|
172
256
|
end
|
173
257
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
end
|
179
|
-
|
180
|
-
def create(*options)
|
181
|
-
check_if_release_dir
|
182
|
-
if options.size == 1 && File.file?(options[0])
|
183
|
-
create_from_manifest(options[0])
|
184
|
-
release_filename = options[0]
|
258
|
+
if rebase
|
259
|
+
say("Uploading release (#{"will be rebased".yellow})")
|
260
|
+
status, _ = director.rebase_release(tarball_path)
|
261
|
+
task_report(status, "Release rebased")
|
185
262
|
else
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
if release_filename
|
190
|
-
release.latest_release_filename = release_filename
|
191
|
-
release.save_config
|
263
|
+
say("\nUploading release\n")
|
264
|
+
status, _ = director.upload_release(tarball_path)
|
265
|
+
task_report(status, "Release uploaded")
|
192
266
|
end
|
193
267
|
end
|
194
268
|
|
195
269
|
def create_from_manifest(manifest_file)
|
196
270
|
say("Recreating release from the manifest")
|
197
271
|
Bosh::Cli::ReleaseCompiler.compile(manifest_file, release.blobstore)
|
272
|
+
manifest_file
|
198
273
|
end
|
199
274
|
|
200
|
-
def create_from_spec
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
manifest_only = !flags.delete("--with-tarball")
|
206
|
-
dry_run = flags.delete("--dry-run")
|
275
|
+
def create_from_spec
|
276
|
+
final = options[:final]
|
277
|
+
force = options[:force]
|
278
|
+
manifest_only = !options[:with_tarball]
|
279
|
+
dry_run = options[:dry_run]
|
207
280
|
|
208
281
|
if final && !release.has_blobstore_secret?
|
209
|
-
|
210
|
-
exit(1)
|
211
|
-
end
|
212
|
-
|
213
|
-
if flags.size > 0
|
214
|
-
say("Unknown flags: #{flags.keys.join(", ")}".red)
|
215
|
-
show_usage
|
216
|
-
exit(1)
|
282
|
+
err("Can't create final release without blobstore secret")
|
217
283
|
end
|
218
284
|
|
219
285
|
blob_manager.sync
|
@@ -229,16 +295,13 @@ module Bosh::Cli::Command
|
|
229
295
|
check_if_dirty_state unless force
|
230
296
|
|
231
297
|
confirmation = "Are you sure you want to " +
|
232
|
-
|
298
|
+
"generate #{'final'.red} version? "
|
233
299
|
|
234
300
|
if final && !dry_run && !confirmed?(confirmation)
|
235
301
|
say("Canceled release generation".green)
|
236
302
|
exit(1)
|
237
303
|
end
|
238
304
|
|
239
|
-
packages = []
|
240
|
-
jobs = []
|
241
|
-
|
242
305
|
if final
|
243
306
|
header("Building FINAL release".green)
|
244
307
|
release_name = release.final_name
|
@@ -249,12 +312,12 @@ module Bosh::Cli::Command
|
|
249
312
|
|
250
313
|
if version_greater(release.min_cli_version, Bosh::Cli::VERSION)
|
251
314
|
err("You should use CLI >= #{release.min_cli_version} " +
|
252
|
-
|
315
|
+
"with this release, you have #{Bosh::Cli::VERSION}")
|
253
316
|
end
|
254
317
|
|
255
318
|
if release_name.blank?
|
256
319
|
confirmation = "Please enter %s release name: " % [
|
257
|
-
|
320
|
+
final ? "final" : "development"]
|
258
321
|
name = interactive? ? ask(confirmation).to_s : DEFAULT_RELEASE_NAME
|
259
322
|
err("Canceled release creation, no name given") if name.blank?
|
260
323
|
if final
|
@@ -266,23 +329,17 @@ module Bosh::Cli::Command
|
|
266
329
|
end
|
267
330
|
|
268
331
|
header("Building packages")
|
269
|
-
Dir[File.join(work_dir, "packages", "*")].each do |package_dir|
|
270
|
-
next unless File.directory?(package_dir)
|
271
|
-
package_dirname = File.basename(package_dir)
|
272
|
-
package_spec = load_yaml_file(File.join(package_dir, "spec"))
|
273
|
-
|
274
|
-
if package_spec["name"] != package_dirname
|
275
|
-
err("Found `#{package_spec["name"]}' package in " +
|
276
|
-
"`#{package_dirname}' directory, please fix it")
|
277
|
-
end
|
278
332
|
|
279
|
-
|
280
|
-
|
281
|
-
|
333
|
+
packages = Bosh::Cli::PackageBuilder.discover(
|
334
|
+
work_dir,
|
335
|
+
:final => final,
|
336
|
+
:blobstore => release.blobstore,
|
337
|
+
:dry_run => dry_run
|
338
|
+
)
|
282
339
|
|
340
|
+
packages.each do |package|
|
283
341
|
say("Building #{package.name.green}...")
|
284
342
|
package.build
|
285
|
-
packages << package
|
286
343
|
nl
|
287
344
|
end
|
288
345
|
|
@@ -294,7 +351,7 @@ module Bosh::Cli::Command
|
|
294
351
|
sorted_packages = tsort_packages(package_index)
|
295
352
|
header("Resolving dependencies")
|
296
353
|
say("Dependencies resolved, correct build order is:")
|
297
|
-
|
354
|
+
sorted_packages.each do |package_name|
|
298
355
|
say("- %s" % [package_name])
|
299
356
|
end
|
300
357
|
nl
|
@@ -303,28 +360,17 @@ module Bosh::Cli::Command
|
|
303
360
|
built_package_names = packages.map { |package| package.name }
|
304
361
|
|
305
362
|
header("Building jobs")
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
job_spec = load_yaml_file(File.join(job_dir, "spec"))
|
317
|
-
if job_spec["name"] != job_dirname
|
318
|
-
err("Found `#{job_spec["name"]}' job in " +
|
319
|
-
"`#{job_dirname}' directory, please fix it")
|
320
|
-
end
|
321
|
-
|
322
|
-
job = Bosh::Cli::JobBuilder.new(job_spec, work_dir, final,
|
323
|
-
release.blobstore, built_package_names)
|
324
|
-
job.dry_run = dry_run
|
363
|
+
jobs = Bosh::Cli::JobBuilder.discover(
|
364
|
+
work_dir,
|
365
|
+
:final => final,
|
366
|
+
:blobstore => release.blobstore,
|
367
|
+
:dry_run => dry_run,
|
368
|
+
:package_names => built_package_names
|
369
|
+
)
|
370
|
+
|
371
|
+
jobs.each do |job|
|
325
372
|
say("Building #{job.name.green}...")
|
326
373
|
job.build
|
327
|
-
jobs << job
|
328
374
|
nl
|
329
375
|
end
|
330
376
|
|
@@ -350,7 +396,7 @@ module Bosh::Cli::Command
|
|
350
396
|
|
351
397
|
unless manifest_only
|
352
398
|
say("Release tarball (#{pretty_size(builder.tarball_path)}): " +
|
353
|
-
|
399
|
+
builder.tarball_path.green)
|
354
400
|
end
|
355
401
|
|
356
402
|
release.min_cli_version = Bosh::Cli::VERSION
|
@@ -359,74 +405,33 @@ module Bosh::Cli::Command
|
|
359
405
|
builder.manifest_path
|
360
406
|
end
|
361
407
|
|
362
|
-
def
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
if confirmed?
|
367
|
-
say("Removing dev_builds index...")
|
368
|
-
FileUtils.rm_rf(".dev_builds")
|
369
|
-
say("Clearing dev name...")
|
370
|
-
release.dev_name = nil
|
371
|
-
release.save_config
|
372
|
-
say("Removing dev tarballs...")
|
373
|
-
FileUtils.rm_rf("dev_releases")
|
374
|
-
|
375
|
-
say("Release has been reset".green)
|
408
|
+
def git_init
|
409
|
+
out = %x{git init 2>&1}
|
410
|
+
if $? != 0
|
411
|
+
say("error running 'git init':\n#{out}")
|
376
412
|
else
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
t << [r["name"], versions.join(", ")]
|
413
|
+
File.open(".gitignore", "w") do |f|
|
414
|
+
f << <<-EOS.gsub(/^\s{10}/, '')
|
415
|
+
config/dev.yml
|
416
|
+
config/private.yml
|
417
|
+
releases/*.tgz
|
418
|
+
dev_releases
|
419
|
+
.blobs
|
420
|
+
blobs
|
421
|
+
.dev_builds
|
422
|
+
.idea
|
423
|
+
.DS_Store
|
424
|
+
.final_builds/jobs/**/*.tgz
|
425
|
+
.final_builds/packages/**/*.tgz
|
426
|
+
*.swp
|
427
|
+
*~
|
428
|
+
*#
|
429
|
+
#*
|
430
|
+
EOS
|
397
431
|
end
|
398
432
|
end
|
399
|
-
|
400
|
-
|
401
|
-
say(releases_table)
|
402
|
-
nl
|
403
|
-
say("Releases total: %d" % releases.size)
|
404
|
-
end
|
405
|
-
|
406
|
-
def delete(name, *options)
|
407
|
-
auth_required
|
408
|
-
force = options.include?("--force")
|
409
|
-
options.delete("--force")
|
410
|
-
version = options.shift
|
411
|
-
|
412
|
-
desc = "release `#{name}'"
|
413
|
-
desc << " version #{version}" if version
|
414
|
-
|
415
|
-
if force
|
416
|
-
say("Deleting #{desc} (FORCED DELETE, WILL IGNORE ERRORS)".red)
|
417
|
-
elsif options.size > 0
|
418
|
-
err("Unknown option, currently only '--force' is supported")
|
419
|
-
else
|
420
|
-
say("Deleting #{desc}".red)
|
421
|
-
end
|
422
|
-
|
423
|
-
if confirmed?
|
424
|
-
status, _ = director.delete_release(name, :force => force,
|
425
|
-
:version => version)
|
426
|
-
task_report(status, "Deleted #{desc}")
|
427
|
-
else
|
428
|
-
say("Canceled deleting release".green)
|
429
|
-
end
|
433
|
+
rescue Errno::ENOENT
|
434
|
+
say("Unable to run 'git init'".red)
|
430
435
|
end
|
431
436
|
|
432
437
|
private
|
@@ -446,14 +451,14 @@ module Bosh::Cli::Command
|
|
446
451
|
|
447
452
|
def show_summary(builder)
|
448
453
|
packages_table = table do |t|
|
449
|
-
t.headings = %w(Name Version Notes
|
454
|
+
t.headings = %w(Name Version Notes)
|
450
455
|
builder.packages.each do |package|
|
451
456
|
t << artefact_summary(package)
|
452
457
|
end
|
453
458
|
end
|
454
459
|
|
455
460
|
jobs_table = table do |t|
|
456
|
-
t.headings = %w(Name Version Notes
|
461
|
+
t.headings = %w(Name Version Notes)
|
457
462
|
builder.jobs.each do |job|
|
458
463
|
t << artefact_summary(job)
|
459
464
|
end
|
@@ -487,7 +492,6 @@ module Bosh::Cli::Command
|
|
487
492
|
result << artefact.name
|
488
493
|
result << artefact.version
|
489
494
|
result << artefact.notes.join(", ")
|
490
|
-
result << artefact.fingerprint
|
491
495
|
result
|
492
496
|
end
|
493
497
|
|
@@ -506,14 +510,15 @@ module Bosh::Cli::Command
|
|
506
510
|
end
|
507
511
|
|
508
512
|
def match_remote_packages(manifest_yaml)
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
513
|
+
director.match_packages(manifest_yaml)
|
514
|
+
rescue Bosh::Cli::DirectorError
|
515
|
+
msg = "You are using CLI >= 0.20 with director that doesn't support " +
|
516
|
+
"package matches.\nThis will result in uploading all packages " +
|
517
|
+
"and jobs to your director.\nIt is recommended to update your " +
|
518
|
+
"director or downgrade your CLI to 0.19.6"
|
519
|
+
|
520
|
+
say(msg.yellow)
|
521
|
+
exit(1) unless confirmed?
|
517
522
|
end
|
518
523
|
end
|
519
524
|
end
|