bento-ya 0.1.4 → 1.0.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/.travis.yml +19 -0
- data/CHANGELOG.md +20 -1
- data/Gemfile +11 -2
- data/README.md +1 -1
- data/Rakefile +22 -1
- data/bento-ya.gemspec +4 -5
- data/bin/bento +1 -1
- data/lib/bento.rb +2 -2
- data/lib/bento/build.rb +19 -13
- data/lib/bento/buildmetadata.rb +10 -10
- data/lib/bento/cli.rb +47 -64
- data/lib/bento/common.rb +55 -17
- data/lib/bento/delete.rb +6 -6
- data/lib/bento/normalize.rb +5 -6
- data/lib/bento/packerexec.rb +0 -1
- data/lib/bento/providermetadata.rb +26 -12
- data/lib/bento/release.rb +7 -7
- data/lib/bento/revoke.rb +7 -7
- data/lib/bento/test.rb +15 -11
- data/lib/bento/upload.rb +19 -10
- data/lib/bento/version.rb +1 -1
- data/templates/bootstrap.sh.erb +1 -0
- data/templates/kitchen.yml.erb +3 -3
- metadata +11 -26
- data/lib/bento/build_remote.rb +0 -116
- data/lib/bento/httpstuff.rb +0 -73
- data/lib/bento/vagrantcloud.rb +0 -138
data/lib/bento/common.rb
CHANGED
@@ -1,12 +1,16 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
require "benchmark"
|
2
|
+
require "fileutils"
|
3
|
+
require "json"
|
4
|
+
require "tempfile"
|
5
|
+
require "yaml"
|
6
|
+
require "vagrant_cloud"
|
6
7
|
|
7
8
|
MEGABYTE = 1024.0 * 1024.0
|
8
9
|
|
9
10
|
module Common
|
11
|
+
def vc_account
|
12
|
+
VagrantCloud::Account.new(ENV["VAGRANT_CLOUD_ORG"], ENV["VAGRANT_CLOUD_TOKEN"])
|
13
|
+
end
|
10
14
|
|
11
15
|
def banner(msg)
|
12
16
|
puts "==> #{msg}"
|
@@ -33,13 +37,13 @@ module Common
|
|
33
37
|
json = JSON.parse(file)
|
34
38
|
|
35
39
|
# metadata needed for upload: boxname, version, provider, box filename
|
36
|
-
metadata[
|
37
|
-
metadata[
|
38
|
-
metadata[
|
39
|
-
metadata[
|
40
|
-
metadata[
|
41
|
-
json[
|
42
|
-
metadata[
|
40
|
+
metadata["name"] = json["name"]
|
41
|
+
metadata["version"] = json["version"]
|
42
|
+
metadata["box_basename"] = json["box_basename"]
|
43
|
+
metadata["tools"] = json["tools"]
|
44
|
+
metadata["providers"] = Hash.new
|
45
|
+
json["providers"].each do |provider|
|
46
|
+
metadata["providers"][provider["name"]] = provider.reject { |k, _| k == "name" }
|
43
47
|
end
|
44
48
|
metadata
|
45
49
|
end
|
@@ -52,16 +56,50 @@ module Common
|
|
52
56
|
`ls builds/*.json`.split("\n")
|
53
57
|
end
|
54
58
|
|
55
|
-
def
|
56
|
-
|
59
|
+
def builds_yml
|
60
|
+
YAML.load(File.read("builds.yml"))
|
57
61
|
end
|
58
62
|
|
59
|
-
def
|
60
|
-
|
63
|
+
def build_list
|
64
|
+
bit32 = []
|
65
|
+
bit64 = []
|
66
|
+
builds_yml["public"].each do |platform, versions|
|
67
|
+
versions.each do |version, archs|
|
68
|
+
archs.each do |arch|
|
69
|
+
folder = case platform
|
70
|
+
when "opensuse-leap"
|
71
|
+
"opensuse"
|
72
|
+
when "oracle"
|
73
|
+
"oraclelinux"
|
74
|
+
else
|
75
|
+
platform
|
76
|
+
end
|
77
|
+
case arch
|
78
|
+
when "i386"
|
79
|
+
bit32 << "#{folder}/#{platform}-#{version}-#{arch}"
|
80
|
+
else
|
81
|
+
bit64 << "#{folder}/#{platform}-#{version}-#{arch}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
bit64 + bit32
|
61
87
|
end
|
62
88
|
|
63
89
|
def private_box?(boxname)
|
64
|
-
proprietary_os_list = %w
|
90
|
+
proprietary_os_list = %w{macos windows sles solaris rhel}
|
65
91
|
proprietary_os_list.any? { |p| boxname.include?(p) }
|
66
92
|
end
|
93
|
+
|
94
|
+
def os_x?
|
95
|
+
!!(RUBY_PLATFORM =~ /darwin/)
|
96
|
+
end
|
97
|
+
|
98
|
+
def unix?
|
99
|
+
!windows?
|
100
|
+
end
|
101
|
+
|
102
|
+
def windows?
|
103
|
+
!!(RUBY_PLATFORM =~ /mswin|mingw|windows/)
|
104
|
+
end
|
67
105
|
end
|
data/lib/bento/delete.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
require
|
2
|
-
require 'bento/vagrantcloud'
|
1
|
+
require "bento/common"
|
3
2
|
|
4
3
|
class DeleteRunner
|
5
4
|
include Common
|
6
|
-
include VgCloud
|
7
5
|
|
8
|
-
attr_reader :
|
6
|
+
attr_reader :box, :version
|
9
7
|
|
10
8
|
def initialize(opts)
|
11
|
-
@
|
9
|
+
@box = opts.box
|
12
10
|
@version = opts.version
|
13
11
|
end
|
14
12
|
|
15
13
|
def start
|
16
14
|
banner("Starting Delete...")
|
17
15
|
time = Benchmark.measure do
|
18
|
-
|
16
|
+
box = vc_account.get_box(box)
|
17
|
+
version = box.get_version(version)
|
18
|
+
version.delete
|
19
19
|
end
|
20
20
|
banner("Delete finished in #{duration(time.real)}.")
|
21
21
|
end
|
data/lib/bento/normalize.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require "bento/common"
|
2
2
|
|
3
3
|
class NormalizeRunner
|
4
|
-
|
5
4
|
include Common
|
6
5
|
include PackerExec
|
7
6
|
|
@@ -25,7 +24,7 @@ class NormalizeRunner
|
|
25
24
|
if !@modified.empty?
|
26
25
|
info("")
|
27
26
|
info("The following templates were modified:")
|
28
|
-
@modified.sort.each { |template| info(" * #{template}")}
|
27
|
+
@modified.sort.each { |template| info(" * #{template}") }
|
29
28
|
end
|
30
29
|
banner("Normalizing finished in #{duration(time.real)}.")
|
31
30
|
end
|
@@ -41,7 +40,7 @@ class NormalizeRunner
|
|
41
40
|
|
42
41
|
banner("[#{template}] Fixing")
|
43
42
|
original_checksum = checksum(file)
|
44
|
-
output =
|
43
|
+
output = `packer fix #{file}`
|
45
44
|
raise "[#{template}] Error fixing, exited #{$?}" if $?.exitstatus != 0
|
46
45
|
# preserve ampersands in shell commands,
|
47
46
|
# see: https://github.com/mitchellh/packer/issues/784
|
@@ -59,7 +58,7 @@ class NormalizeRunner
|
|
59
58
|
|
60
59
|
def packer_validate_cmd(template, var_file)
|
61
60
|
vars = "#{template}.variables.json"
|
62
|
-
cmd = %W
|
61
|
+
cmd = %W{packer validate -var-file=#{var_file} #{template}.json}
|
63
62
|
cmd.insert(2, "-var-file=#{vars}") if File.exist?(vars)
|
64
63
|
cmd
|
65
64
|
end
|
@@ -74,7 +73,7 @@ class NormalizeRunner
|
|
74
73
|
banner("[#{template}] DEBUG: md_file(#{md_file.path}) is:")
|
75
74
|
puts IO.read(md_file.path)
|
76
75
|
end
|
77
|
-
system(*cmd)
|
76
|
+
system(*cmd) || raise( "[#{template}] Error validating, exited #{$?}")
|
78
77
|
end
|
79
78
|
end
|
80
79
|
end
|
data/lib/bento/packerexec.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require "digest"
|
2
|
+
require "bento/common"
|
2
3
|
|
3
4
|
class ProviderMetadata
|
5
|
+
include Common
|
4
6
|
|
5
7
|
def initialize(path, box_basename)
|
6
8
|
@base = File.join(path, box_basename)
|
@@ -24,7 +26,12 @@ class ProviderMetadata
|
|
24
26
|
attr_reader :base
|
25
27
|
|
26
28
|
def provider_from_file(file)
|
27
|
-
file.sub(/^.*\.([^.]+)\.box$/, '\1')
|
29
|
+
provider = file.sub(/^.*\.([^.]+)\.box$/, '\1')
|
30
|
+
if provider == "vmware"
|
31
|
+
"vmware_desktop"
|
32
|
+
else
|
33
|
+
provider
|
34
|
+
end
|
28
35
|
end
|
29
36
|
|
30
37
|
def shasum(file)
|
@@ -33,14 +40,14 @@ class ProviderMetadata
|
|
33
40
|
|
34
41
|
def size_in_mb(file)
|
35
42
|
size = File.size(file)
|
36
|
-
size_mb = size /
|
43
|
+
size_mb = size / MEGABYTE
|
37
44
|
size_mb.ceil.to_s
|
38
45
|
end
|
39
46
|
|
40
47
|
def version(provider)
|
41
48
|
case provider
|
42
49
|
when /vmware/
|
43
|
-
|
50
|
+
ver_vmware
|
44
51
|
when /virtualbox/
|
45
52
|
ver_vbox
|
46
53
|
when /parallels/
|
@@ -48,23 +55,30 @@ class ProviderMetadata
|
|
48
55
|
end
|
49
56
|
end
|
50
57
|
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
58
|
+
def ver_vmware
|
59
|
+
if os_x?
|
60
|
+
path = File.join('/Applications/VMware\ Fusion.app/Contents/Library')
|
61
|
+
fusion_cmd = File.join(path, "vmware-vmx -v")
|
62
|
+
cmd = Mixlib::ShellOut.new(fusion_cmd)
|
63
|
+
cmd.run_command
|
64
|
+
cmd.stderr.split(" ")[5]
|
65
|
+
else
|
66
|
+
cmd = Mixlib::ShellOut.new("vmware --version")
|
67
|
+
cmd.run_command
|
68
|
+
cmd.stdout.split(" ")[2]
|
69
|
+
end
|
57
70
|
end
|
58
71
|
|
59
72
|
def ver_parallels
|
73
|
+
raise "Platform is not macOS / OS X, exiting..." unless os_x?
|
60
74
|
cmd = Mixlib::ShellOut.new("prlctl --version")
|
61
75
|
cmd.run_command
|
62
|
-
cmd.stdout.split(
|
76
|
+
cmd.stdout.split(" ")[2]
|
63
77
|
end
|
64
78
|
|
65
79
|
def ver_vbox
|
66
80
|
cmd = Mixlib::ShellOut.new("VBoxManage --version")
|
67
81
|
cmd.run_command
|
68
|
-
cmd.stdout.split(
|
82
|
+
cmd.stdout.split("r")[0]
|
69
83
|
end
|
70
84
|
end
|
data/lib/bento/release.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
require
|
2
|
-
require 'bento/vagrantcloud'
|
1
|
+
require "bento/common"
|
3
2
|
|
4
3
|
class ReleaseRunner
|
5
4
|
include Common
|
6
|
-
include VgCloud
|
7
5
|
|
8
|
-
attr_reader :
|
6
|
+
attr_reader :box, :version
|
9
7
|
|
10
8
|
def initialize(opts)
|
11
|
-
@
|
9
|
+
@box = opts.box
|
12
10
|
@version = opts.version
|
13
11
|
end
|
14
12
|
|
15
13
|
def start
|
16
|
-
banner("
|
14
|
+
banner("Releasing #{box}/#{version}...")
|
17
15
|
time = Benchmark.measure do
|
18
|
-
|
16
|
+
box = vc_account.get_box(box)
|
17
|
+
version = box.get_version(version)
|
18
|
+
version.release
|
19
19
|
end
|
20
20
|
banner("Release finished in #{duration(time.real)}.")
|
21
21
|
end
|
data/lib/bento/revoke.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
require
|
2
|
-
require 'bento/vagrantcloud'
|
1
|
+
require "bento/common"
|
3
2
|
|
4
3
|
class RevokeRunner
|
5
4
|
include Common
|
6
|
-
include VgCloud
|
7
5
|
|
8
|
-
attr_reader :
|
6
|
+
attr_reader :box, :version
|
9
7
|
|
10
8
|
def initialize(opts)
|
11
|
-
@
|
9
|
+
@box = opts.box
|
12
10
|
@version = opts.version
|
13
11
|
end
|
14
12
|
|
15
13
|
def start
|
16
|
-
banner("
|
14
|
+
banner("Revoking #{box}/#{version}...")
|
17
15
|
time = Benchmark.measure do
|
18
|
-
|
16
|
+
box = vc_account.get_box(box)
|
17
|
+
version = box.get_version(version)
|
18
|
+
version.revoke
|
19
19
|
end
|
20
20
|
banner("Revoke finished in #{duration(time.real)}.")
|
21
21
|
end
|
data/lib/bento/test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "bento/common"
|
2
|
+
require "mixlib/shellout"
|
3
|
+
require "erb"
|
4
4
|
|
5
5
|
class TestRunner
|
6
6
|
include Common
|
@@ -33,7 +33,7 @@ class TestRunner
|
|
33
33
|
boxes = cmd.stdout.split("\n")
|
34
34
|
|
35
35
|
boxes.each do |box|
|
36
|
-
b = box.split(
|
36
|
+
b = box.split(" ")
|
37
37
|
rm_cmd = Mixlib::ShellOut.new("vagrant box remove --force #{b[0]} --provider #{b[1].to_s.gsub(/(,|\()/, '')}")
|
38
38
|
banner("Removing #{b[0]} for provider #{b[1].to_s.gsub(/(,|\()/, '')}")
|
39
39
|
rm_cmd.run_command
|
@@ -42,15 +42,19 @@ class TestRunner
|
|
42
42
|
|
43
43
|
def test_box(md_json)
|
44
44
|
md = box_metadata(md_json)
|
45
|
-
@boxname = md[
|
46
|
-
@providers = md[
|
47
|
-
@share_disabled = no_shared || /freebsd/.match(boxname) ? true : false
|
45
|
+
@boxname = md["name"]
|
46
|
+
@providers = md["providers"]
|
47
|
+
@share_disabled = no_shared || /(freebsd|opensuse)/.match(boxname) ? true : false
|
48
48
|
|
49
49
|
dir = "#{File.expand_path("../../", File.dirname(__FILE__))}/templates"
|
50
|
-
|
51
|
-
|
50
|
+
%w{.kitchen.yml bootstrap.sh}.each do |file|
|
51
|
+
t = file =~ /kitchen/ ? "kitchen.yml.erb" : "#{file}.erb"
|
52
|
+
erb = ERB.new(File.read(dir + "/#{t}"), nil, "-").result(binding)
|
53
|
+
File.open(file, "w") { |f| f.puts erb }
|
54
|
+
end
|
52
55
|
|
53
|
-
|
54
|
-
|
56
|
+
test = Mixlib::ShellOut.new("kitchen test", :timeout => 900, live_stream: STDOUT)
|
57
|
+
test.run_command
|
58
|
+
test.error!
|
55
59
|
end
|
56
60
|
end
|
data/lib/bento/upload.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require 'bento/vagrantcloud'
|
1
|
+
require "bento/common"
|
3
2
|
|
4
3
|
class UploadRunner
|
5
4
|
include Common
|
6
|
-
include VgCloud
|
7
5
|
|
8
6
|
attr_reader :md_json
|
9
7
|
|
@@ -14,14 +12,25 @@ class UploadRunner
|
|
14
12
|
def start
|
15
13
|
banner("Starting uploads...")
|
16
14
|
time = Benchmark.measure do
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
else
|
22
|
-
box_upload(md_json)
|
15
|
+
files = md_json ? [md_json] : metadata_files
|
16
|
+
files.each do |md_file|
|
17
|
+
upload(md_file)
|
23
18
|
end
|
24
19
|
end
|
25
|
-
banner("
|
20
|
+
banner("Uploads finished in #{duration(time.real)}.")
|
21
|
+
end
|
22
|
+
|
23
|
+
def upload(md_file)
|
24
|
+
md = box_metadata(md_file)
|
25
|
+
box_description = "a bento box for #{md['name']}"
|
26
|
+
box = vc_account.ensure_box(md["name"], box_description, private_box?(md["name"]))
|
27
|
+
version = box.ensure_version(md["version"], File.read(md_file))
|
28
|
+
|
29
|
+
md["providers"].each do |k, v|
|
30
|
+
provider = version.ensure_provider(k, nil)
|
31
|
+
banner("Uploading #{box.name}/#{version.version}/#{provider.name}...")
|
32
|
+
provider.upload_file("builds/#{v['file']}")
|
33
|
+
banner("#{provider.download_url}")
|
34
|
+
end
|
26
35
|
end
|
27
36
|
end
|
data/lib/bento/version.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
echo "Shell Provisioner Says What"
|
data/templates/kitchen.yml.erb
CHANGED
@@ -7,11 +7,11 @@ platforms:
|
|
7
7
|
- name: <%= @boxname + '-' + k %>
|
8
8
|
driver:
|
9
9
|
name: vagrant
|
10
|
-
<% if k
|
10
|
+
<% if k =~ /vmware/ -%>
|
11
11
|
<% if RUBY_PLATFORM.match(/darwin/) -%>
|
12
|
-
provider: <%=
|
12
|
+
provider: <%= 'vmware_fusion' %>
|
13
13
|
<% else -%>
|
14
|
-
provider: <%=
|
14
|
+
provider: <%= 'vmware_workstation' %>
|
15
15
|
<% end -%>
|
16
16
|
<% else -%>
|
17
17
|
provider: <%= k %>
|
metadata
CHANGED
@@ -1,57 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bento-ya
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Seth Thomas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rake
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '11.2'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '11.2'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: mixlib-shellout
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
|
-
- - "
|
17
|
+
- - ">="
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
19
|
+
version: 2.3.2
|
34
20
|
type: :runtime
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
|
-
- - "
|
24
|
+
- - ">="
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
26
|
+
version: 2.3.2
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
28
|
+
name: vagrant_cloud
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
31
|
- - "~>"
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0
|
33
|
+
version: '1.0'
|
48
34
|
type: :runtime
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
38
|
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0
|
40
|
+
version: '1.0'
|
55
41
|
description: bento-ya builds bento boxes
|
56
42
|
email:
|
57
43
|
- sthomas@chef.io
|
@@ -61,6 +47,7 @@ extensions: []
|
|
61
47
|
extra_rdoc_files: []
|
62
48
|
files:
|
63
49
|
- ".gitignore"
|
50
|
+
- ".travis.yml"
|
64
51
|
- CHANGELOG.md
|
65
52
|
- Gemfile
|
66
53
|
- LICENSE
|
@@ -70,12 +57,10 @@ files:
|
|
70
57
|
- bin/bento
|
71
58
|
- lib/bento.rb
|
72
59
|
- lib/bento/build.rb
|
73
|
-
- lib/bento/build_remote.rb
|
74
60
|
- lib/bento/buildmetadata.rb
|
75
61
|
- lib/bento/cli.rb
|
76
62
|
- lib/bento/common.rb
|
77
63
|
- lib/bento/delete.rb
|
78
|
-
- lib/bento/httpstuff.rb
|
79
64
|
- lib/bento/normalize.rb
|
80
65
|
- lib/bento/packerexec.rb
|
81
66
|
- lib/bento/providermetadata.rb
|
@@ -83,8 +68,8 @@ files:
|
|
83
68
|
- lib/bento/revoke.rb
|
84
69
|
- lib/bento/test.rb
|
85
70
|
- lib/bento/upload.rb
|
86
|
-
- lib/bento/vagrantcloud.rb
|
87
71
|
- lib/bento/version.rb
|
72
|
+
- templates/bootstrap.sh.erb
|
88
73
|
- templates/kitchen.yml.erb
|
89
74
|
homepage: https://github.com/cheeseplus/bento-ya
|
90
75
|
licenses:
|