vagrant-zones 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/codeql-analysis.yml +72 -0
- data/.github/workflows/lint-release-and-publish.yml +70 -0
- data/.github/workflows/ruby-lint.yml +35 -0
- data/.gitignore +35 -0
- data/.rspec +2 -0
- data/.rubocop.yml +143 -0
- data/CHANGELOG.md +0 -0
- data/CODE_OF_CONDUCT.md +128 -0
- data/CONTRIBUTING.md +96 -0
- data/Gemfile +14 -0
- data/LICENSE +651 -0
- data/PULL_REQUEST_TEMPLATE.md +39 -0
- data/README.md +81 -0
- data/RELEASE.md +15 -0
- data/Rakefile +32 -0
- data/SECURITY.md +19 -0
- data/docs/CNAME +1 -0
- data/docs/_config.yml +1 -0
- data/docs/css/main.css +55 -0
- data/docs/css/styles.css +8678 -0
- data/docs/index.html +127 -0
- data/lib/vagrant-zones/action/create.rb +29 -0
- data/lib/vagrant-zones/action/destroy.rb +27 -0
- data/lib/vagrant-zones/action/halt.rb +24 -0
- data/lib/vagrant-zones/action/import.rb +112 -0
- data/lib/vagrant-zones/action/is_created.rb +22 -0
- data/lib/vagrant-zones/action/network.rb +26 -0
- data/lib/vagrant-zones/action/not_created.rb +20 -0
- data/lib/vagrant-zones/action/package.rb +134 -0
- data/lib/vagrant-zones/action/prepare_nfs_valid_ids.rb +24 -0
- data/lib/vagrant-zones/action/restart.rb +53 -0
- data/lib/vagrant-zones/action/setup.rb +26 -0
- data/lib/vagrant-zones/action/shutdown.rb +47 -0
- data/lib/vagrant-zones/action/start.rb +25 -0
- data/lib/vagrant-zones/action/wait_till_boot.rb +59 -0
- data/lib/vagrant-zones/action/wait_till_up.rb +65 -0
- data/lib/vagrant-zones/action.rb +204 -0
- data/lib/vagrant-zones/command/configure_snapshots.rb +49 -0
- data/lib/vagrant-zones/command/console.rb +63 -0
- data/lib/vagrant-zones/command/create_snapshots.rb +46 -0
- data/lib/vagrant-zones/command/delete_snapshots.rb +38 -0
- data/lib/vagrant-zones/command/guest_power_controls.rb +58 -0
- data/lib/vagrant-zones/command/list_snapshots.rb +44 -0
- data/lib/vagrant-zones/command/restart_guest.rb +29 -0
- data/lib/vagrant-zones/command/shutdown_guest.rb +29 -0
- data/lib/vagrant-zones/command/vnc_console.rb +48 -0
- data/lib/vagrant-zones/command/webvnc_console.rb +49 -0
- data/lib/vagrant-zones/command/zfssnapshot.rb +67 -0
- data/lib/vagrant-zones/command/zlogin_console.rb +40 -0
- data/lib/vagrant-zones/command/zone.rb +73 -0
- data/lib/vagrant-zones/config.rb +78 -0
- data/lib/vagrant-zones/driver.rb +1710 -0
- data/lib/vagrant-zones/errors.rb +61 -0
- data/lib/vagrant-zones/executor.rb +38 -0
- data/lib/vagrant-zones/plugin.rb +79 -0
- data/lib/vagrant-zones/provider.rb +83 -0
- data/lib/vagrant-zones/util/subprocess.rb +31 -0
- data/lib/vagrant-zones/util/timer.rb +19 -0
- data/lib/vagrant-zones/version.rb +7 -0
- data/lib/vagrant-zones.rb +29 -0
- data/locales/en.yml +326 -0
- data/vagrant-zones.gemspec +51 -0
- metadata +412 -0
data/docs/index.html
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8" />
|
5
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
7
|
+
<title>Vagrant Zones</title>
|
8
|
+
<link rel="stylesheet" href="css/styles.css" />
|
9
|
+
<link rel="stylesheet" href="css/main.css" />
|
10
|
+
</head>
|
11
|
+
|
12
|
+
<body>
|
13
|
+
<div class="header">
|
14
|
+
<div class="container">
|
15
|
+
<div class="row d-flex">
|
16
|
+
<img
|
17
|
+
src="assets/logo-big.jpg"
|
18
|
+
class="logo-big img-fluid mx-auto mt-4"
|
19
|
+
alt="..."
|
20
|
+
/>
|
21
|
+
</div>
|
22
|
+
<div class="row justify-content-md-center">
|
23
|
+
<div class="menu-link col-md-auto fs-3 p-3 text-center">
|
24
|
+
<a href="index.html">Home</a>
|
25
|
+
</div>
|
26
|
+
<div class="menu-link col-md-auto fs-3 p-3 text-center">
|
27
|
+
<a href="own-your-data.html">Create your Automation</a>
|
28
|
+
</div>
|
29
|
+
<div class="menu-link col-md-auto fs-3 p-3 text-center">
|
30
|
+
<a href="contact-us.html">Issue Tracking</a>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
|
36
|
+
<div class="container">
|
37
|
+
<div class="row my-4">
|
38
|
+
<div class="col">
|
39
|
+
<div class="card shadow">
|
40
|
+
<div class="card-body">
|
41
|
+
<p class="card-text fs-3 text-center">
|
42
|
+
Vagrant-Zone is a plugin for Vagrant which
|
43
|
+
will allow you to sping up bhyve, kvm,
|
44
|
+
LX, illumos, and other zone types as
|
45
|
+
you would a VirtualBox vagrant machine.
|
46
|
+
</p>
|
47
|
+
</div>
|
48
|
+
</div>
|
49
|
+
</div>
|
50
|
+
</div>
|
51
|
+
</div>
|
52
|
+
|
53
|
+
<div class="container">
|
54
|
+
<div class="row">
|
55
|
+
<!-- Card 1 -->
|
56
|
+
<div class="col-md-6 col-lg-3 my-4">
|
57
|
+
<div class="card shadow">
|
58
|
+
<div class="card-body">
|
59
|
+
<h5 class="card-title mb-4">Manage with Confidence</h5>
|
60
|
+
<p class="card-text">
|
61
|
+
Versioning, and automated deployment controls
|
62
|
+
allow you to build your Virtual Machines
|
63
|
+
with confidence the process will be transparent.
|
64
|
+
</p>
|
65
|
+
</div>
|
66
|
+
</div>
|
67
|
+
</div>
|
68
|
+
|
69
|
+
<!-- Card 2 -->
|
70
|
+
<div class="col-md-6 col-lg-3 my-4">
|
71
|
+
<div class="card shadow">
|
72
|
+
<div class="card-body">
|
73
|
+
<h5 class="card-title mb-4">Create your Automation</h5>
|
74
|
+
<p class="card-text">
|
75
|
+
The ability to quickly spin up zones of any type
|
76
|
+
in a repeatable fashion allows, portable, versioned
|
77
|
+
and automatable packages ensuring your projects environments
|
78
|
+
are uniform and debuggable.
|
79
|
+
</p>
|
80
|
+
</div>
|
81
|
+
</div>
|
82
|
+
</div>
|
83
|
+
|
84
|
+
<!-- Card 3 -->
|
85
|
+
<div class="col-md-6 col-lg-3 my-4">
|
86
|
+
<div class="card shadow">
|
87
|
+
<div class="card-body">
|
88
|
+
<h5 class="card-title mb-4">Share with Others</h5>
|
89
|
+
<p class="card-text">
|
90
|
+
This tool will allow you to package and share boxes
|
91
|
+
with other users, helping you develope on a wide
|
92
|
+
array of Hypervisors and Operating Systems.
|
93
|
+
</p>
|
94
|
+
</div>
|
95
|
+
</div>
|
96
|
+
</div>
|
97
|
+
|
98
|
+
<!-- Card 4 -->
|
99
|
+
<div class="col-md-6 col-lg-3 my-4">
|
100
|
+
<div class="card shadow">
|
101
|
+
<div class="card-body">
|
102
|
+
<h5 class="card-title mb-4">Feature Requests</h5>
|
103
|
+
<p class="card-text">
|
104
|
+
Reach out to use in a GitHub issue and let us know what
|
105
|
+
your projects goals are. If you can commit to testing
|
106
|
+
we can work on getting your feature commited.
|
107
|
+
</p>
|
108
|
+
</div>
|
109
|
+
</div>
|
110
|
+
</div>
|
111
|
+
</div>
|
112
|
+
</div>
|
113
|
+
|
114
|
+
<div class="container">
|
115
|
+
<div class="card shadow footer mt-5">
|
116
|
+
<img
|
117
|
+
src="assets/logo-small.png"
|
118
|
+
class="logo-small mx-auto my-4"
|
119
|
+
alt="..."
|
120
|
+
/>
|
121
|
+
<p class="copyright text-center pb-4 mb-0">
|
122
|
+
©2022 STARTcloud, Inc.
|
123
|
+
</p>
|
124
|
+
</div>
|
125
|
+
</div>
|
126
|
+
</body>
|
127
|
+
</html>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'log4r'
|
4
|
+
require 'securerandom'
|
5
|
+
require 'digest/md5'
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module ProviderZone
|
9
|
+
module Action
|
10
|
+
# This will create the zone
|
11
|
+
class Create
|
12
|
+
def initialize(app, _env)
|
13
|
+
@logger = Log4r::Logger.new('vagrant_zones::action::import')
|
14
|
+
@app = app
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
@machine = env[:machine]
|
19
|
+
@driver = @machine.provider.driver
|
20
|
+
@machine.id = SecureRandom.uuid
|
21
|
+
@driver.create_dataset(env[:ui])
|
22
|
+
@driver.zonecfg(env[:ui])
|
23
|
+
@driver.install(env[:ui])
|
24
|
+
@app.call(env)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'log4r'
|
4
|
+
require 'securerandom'
|
5
|
+
require 'digest/md5'
|
6
|
+
module VagrantPlugins
|
7
|
+
module ProviderZone
|
8
|
+
module Action
|
9
|
+
# This will destroy the zone
|
10
|
+
class Destroy
|
11
|
+
def initialize(app, _env)
|
12
|
+
@logger = Log4r::Logger.new('vagrant_zones::action::import')
|
13
|
+
@app = app
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(env)
|
17
|
+
@machine = env[:machine]
|
18
|
+
@driver = @machine.provider.driver
|
19
|
+
@driver.halt(env[:ui])
|
20
|
+
@driver.destroy(env[:ui])
|
21
|
+
@driver.delete_dataset(env[:ui])
|
22
|
+
@app.call(env)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'log4r'
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module ProviderZone
|
7
|
+
module Action
|
8
|
+
# This will halt the zone
|
9
|
+
class Halt
|
10
|
+
def initialize(app, _env)
|
11
|
+
@logger = Log4r::Logger.new('vagrant_zones::action::import')
|
12
|
+
@app = app
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
@machine = env[:machine]
|
17
|
+
@driver = @machine.provider.driver
|
18
|
+
@driver.halt(env[:ui])
|
19
|
+
@app.call(env)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
require 'vagrant-zones/util/subprocess'
|
5
|
+
require 'pp'
|
6
|
+
require 'vagrant/box_metadata'
|
7
|
+
require 'vagrant/util/downloader'
|
8
|
+
require 'vagrant/util/platform'
|
9
|
+
require 'vagrant/util/safe_chdir'
|
10
|
+
require 'vagrant/util/subprocess'
|
11
|
+
|
12
|
+
module VagrantPlugins
|
13
|
+
module ProviderZone
|
14
|
+
module Action
|
15
|
+
# This will import the zone boot image from the cloud, cache or file
|
16
|
+
class Import
|
17
|
+
def initialize(app, _env)
|
18
|
+
@logger = Log4r::Logger.new('vagrant_zones::action::import')
|
19
|
+
@joyent_images_url = 'https://images.joyent.com/images/'
|
20
|
+
@app = app
|
21
|
+
end
|
22
|
+
|
23
|
+
def validate_uuid_format(uuid)
|
24
|
+
uuid_regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
|
25
|
+
return true if uuid_regex.match?(uuid.to_s.downcase)
|
26
|
+
end
|
27
|
+
|
28
|
+
def call(env)
|
29
|
+
@machine = env[:machine]
|
30
|
+
@executor = Executor::Exec.new
|
31
|
+
image = @machine.config.vm.box
|
32
|
+
curdir = Dir.pwd
|
33
|
+
datadir = @machine.data_dir
|
34
|
+
@driver = @machine.provider.driver
|
35
|
+
ui = env[:ui]
|
36
|
+
ui.info(I18n.t('vagrant_zones.meeting'))
|
37
|
+
ui.info(I18n.t('vagrant_zones.datadir'))
|
38
|
+
ui.info(" #{datadir}")
|
39
|
+
ui.info(I18n.t('vagrant_zones.detecting_box'))
|
40
|
+
|
41
|
+
# If image ends on '.zss' it's a local ZFS snapshot which should be used
|
42
|
+
if image[-4, 4] == '.zss'
|
43
|
+
if File.exist?("#{curdir}/#{image}")
|
44
|
+
FileUtils.cp("#{curdir}/#{image}", "#{datadir}/#{image}")
|
45
|
+
ui.info(I18n.t('vagrant_zones.zfs_snapshot_stream_detected'))
|
46
|
+
elsif !File.exist?("#{datadir}/#{image}")
|
47
|
+
raise Vagrant::Errors::BoxNotFound
|
48
|
+
end
|
49
|
+
## If image looks like an UUID, download the ZFS snapshot from Joyent images server
|
50
|
+
elsif validate_uuid_format(image)
|
51
|
+
raise Vagrant::Errors::BoxNotFound unless check(image, ui)
|
52
|
+
|
53
|
+
uri = URI("#{@joyent_images_url}#{image}/file")
|
54
|
+
Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
|
55
|
+
request = Net::HTTP::Get.new uri
|
56
|
+
http.request request do |response|
|
57
|
+
file_size = response['content-length'].to_i
|
58
|
+
amount_downloaded = 0
|
59
|
+
ratelimit = 0
|
60
|
+
rate = 500
|
61
|
+
large_file = "#{datadir}/#{image}"
|
62
|
+
File.open(large_file, 'wb') do |io|
|
63
|
+
response.read_body do |chunk|
|
64
|
+
io.write chunk
|
65
|
+
amount_downloaded += chunk.size
|
66
|
+
ui.rewriting do |uiprogress|
|
67
|
+
ratelimit += 1
|
68
|
+
if ratelimit >= rate
|
69
|
+
uiprogress.clear_line
|
70
|
+
status = format('%.2f%%', (amount_downloaded.to_f / file_size * 100))
|
71
|
+
uiprogress.info(I18n.t('vagrant_zones.importing_joyent_image') + "#{image} ==> ", new_line: false)
|
72
|
+
uiprogress.report_progress(status, 100, false)
|
73
|
+
ratelimit = 0
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
ui.clear_line
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
ui.info(I18n.t('vagrant_zones.joyent_image_uuid_detected') + image)
|
82
|
+
|
83
|
+
## If it's a regular name (everything else), try to find it on Vagrant Cloud
|
84
|
+
else
|
85
|
+
# Support zss maybe zst? Same thing? format only for now, use other images and convert later
|
86
|
+
box_format = env[:machine].box.metadata['format'] unless env[:machine].box.nil?
|
87
|
+
|
88
|
+
if box_format == 'ovf'
|
89
|
+
## Insert Future Code to try to convert existing box
|
90
|
+
ui.info(I18n.t('vagrant_zones.detected_ovf_format'))
|
91
|
+
end
|
92
|
+
|
93
|
+
## No Local box template exists, Lets use Vagrant HandleBox to download the Box template
|
94
|
+
ui.info(I18n.t('vagrant_zones.vagrant_cloud_box_detected'))
|
95
|
+
ui.info(" #{image}")
|
96
|
+
ui.clear_line
|
97
|
+
end
|
98
|
+
@app.call(env)
|
99
|
+
end
|
100
|
+
|
101
|
+
def execute(*cmd, **opts, &block)
|
102
|
+
@executor.execute(*cmd, **opts, &block)
|
103
|
+
end
|
104
|
+
|
105
|
+
def check(uuid, env_ui)
|
106
|
+
execute(true, "curl --output /dev/null --silent -r 0-0 --fail #{@joyent_images_url}/#{uuid}")
|
107
|
+
env_ui.info(I18n.t('vagrant_zones.joyent_image_uuid_verified') + @joyent_images_url + uuid)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'log4r'
|
4
|
+
module VagrantPlugins
|
5
|
+
module ProviderZone
|
6
|
+
module Action
|
7
|
+
# This can be used with 'Call' built-in to check if the machine
|
8
|
+
# is created and branch in the middleware.
|
9
|
+
class IsCreated
|
10
|
+
def initialize(app, _env)
|
11
|
+
@app = app
|
12
|
+
@logger = Log4r::Logger.new('vagrant_zones::action')
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
env[:result] = env[:machine].state.id != :not_created
|
17
|
+
@app.call(env)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'log4r'
|
4
|
+
require 'securerandom'
|
5
|
+
require 'digest/md5'
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module ProviderZone
|
9
|
+
module Action
|
10
|
+
# This is use to define the network
|
11
|
+
class Network
|
12
|
+
def initialize(app, _env)
|
13
|
+
@logger = Log4r::Logger.new('vagrant_zones::action::import')
|
14
|
+
@app = app
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
@machine = env[:machine]
|
19
|
+
@driver = @machine.provider.driver
|
20
|
+
@driver.network(env[:ui], 'create')
|
21
|
+
@app.call(env)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'log4r'
|
4
|
+
module VagrantPlugins
|
5
|
+
module ProviderZone
|
6
|
+
module Action
|
7
|
+
# This is used to determine if the VM is created
|
8
|
+
class NotCreated
|
9
|
+
def initialize(app, _env)
|
10
|
+
@app = app
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
env[:ui].info(I18n.t('vagrant_zones.states.not_created'))
|
15
|
+
@app.call(env)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'log4r'
|
4
|
+
module VagrantPlugins
|
5
|
+
module ProviderZone
|
6
|
+
module Action
|
7
|
+
# This is used to package the VM into a box
|
8
|
+
class Package
|
9
|
+
def initialize(app, env)
|
10
|
+
@logger = Log4r::Logger.new('vagrant_zones::action::import')
|
11
|
+
@app = app
|
12
|
+
@executor = Executor::Exec.new
|
13
|
+
@pfexec = if Process.uid.zero?
|
14
|
+
''
|
15
|
+
elsif system('sudo -v')
|
16
|
+
'sudo'
|
17
|
+
else
|
18
|
+
'pfexec'
|
19
|
+
end
|
20
|
+
env['package.output'] ||= 'package.box'
|
21
|
+
end
|
22
|
+
|
23
|
+
def execute(*cmd, **opts, &block)
|
24
|
+
@executor.execute(*cmd, **opts, &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def call(env)
|
28
|
+
@machine = env[:machine]
|
29
|
+
@driver = @machine.provider.driver
|
30
|
+
name = @machine.name
|
31
|
+
boxname = env['package.output']
|
32
|
+
brand = @machine.provider_config.brand
|
33
|
+
kernel = @machine.provider_config.kernel
|
34
|
+
vcc = @machine.provider_config.vagrant_cloud_creator
|
35
|
+
boxshortname = @machine.provider_config.boxshortname
|
36
|
+
raise "#{boxname}: Already exists" if File.exist?(boxname)
|
37
|
+
|
38
|
+
## Create Snapshot
|
39
|
+
tmp_dir = "#{Dir.pwd}/_tmp_package"
|
40
|
+
Dir.mkdir(tmp_dir)
|
41
|
+
datasetpath = "#{@machine.provider_config.boot['array']}/#{@machine.provider_config.boot['dataset']}/#{name}"
|
42
|
+
t = Time.new
|
43
|
+
d = '-'
|
44
|
+
c = ':'
|
45
|
+
datetime = %(#{t.year}#{d}#{t.month}#{d}#{t.day}#{d}#{t.hour}#{c}#{t.min}#{c}#{t.sec})
|
46
|
+
snapshot_create(datasetpath, datetime, env[:ui], @machine.provider_config)
|
47
|
+
snapshot_send(datasetpath, "#{tmp_dir}/box.zss", datetime, env[:ui], @machine.provider_config)
|
48
|
+
## snapshot_delete(datasetpath, env[:ui], datetime)
|
49
|
+
|
50
|
+
# Package VM
|
51
|
+
extra = ''
|
52
|
+
|
53
|
+
## Include User Extra Files
|
54
|
+
@tmp_include = "#{tmp_dir}/_include"
|
55
|
+
if env['package.include']
|
56
|
+
extra = './_include'
|
57
|
+
Dir.mkdir(@tmp_include)
|
58
|
+
env['package.include'].each do |f|
|
59
|
+
env[:ui].info("Including user file: #{f}")
|
60
|
+
FileUtils.cp(f, @tmp_include)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
## Include Vagrant file
|
65
|
+
if env['package.vagrantfile']
|
66
|
+
extra = './_include'
|
67
|
+
Dir.mkdir(@tmp_include) unless File.directory?(@tmp_include)
|
68
|
+
env[:ui].info('Including user Vagrantfile')
|
69
|
+
FileUtils.cp(env['package.vagrantfile'], "#{@tmp_include}/Vagrantfile")
|
70
|
+
end
|
71
|
+
|
72
|
+
## Create the Metadata and Vagrantfile
|
73
|
+
Dir.chdir(tmp_dir)
|
74
|
+
File.write('./metadata.json', metadata_content(brand, kernel, vcc, boxshortname))
|
75
|
+
File.write('./Vagrantfile', vagrantfile_content(brand, kernel, datasetpath))
|
76
|
+
|
77
|
+
## Create the Box file
|
78
|
+
assemble_box(boxname, extra)
|
79
|
+
FileUtils.mv("#{tmp_dir}/#{boxname}", "../#{boxname}")
|
80
|
+
Dir.chdir('../')
|
81
|
+
FileUtils.rm_rf(tmp_dir)
|
82
|
+
|
83
|
+
env[:ui].info("Box created, You can now add the box: 'vagrant box add #{boxname} --nameofnewbox'")
|
84
|
+
@app.call(env)
|
85
|
+
end
|
86
|
+
|
87
|
+
def snapshot_create(datasetpath, datetime, uii, config)
|
88
|
+
uii.info('Creating a Snapshot of the box.')
|
89
|
+
result = execute(true, "#{@pfexec} zfs snapshot -r #{datasetpath}/boot@vagrant_box#{datetime}")
|
90
|
+
uii.info("#{@pfexec} zfs snapshot -r #{datasetpath}/boot@vagrant_box#{datetime}") if result.zero? && config.debug
|
91
|
+
end
|
92
|
+
|
93
|
+
def snapshot_delete(datasetpath, uii, datetime)
|
94
|
+
result = execute(true, "#{@pfexec} zfs destroy -r -f #{datasetpath}/boot@vagrant_box#{datetime}")
|
95
|
+
uii.info("#{@pfexec} zfs destroy -r -f #{datasetpath}/boot@vagrant_box#{datetime}") if result.zero? && config.debug
|
96
|
+
end
|
97
|
+
|
98
|
+
def snapshot_send(datasetpath, destination, datetime, uii, config)
|
99
|
+
uii.info('Sending Snapshot to ZFS Send Stream image.')
|
100
|
+
result = execute(true, "#{@pfexec} zfs send #{datasetpath}/boot@vagrant_box#{datetime} > #{destination}")
|
101
|
+
puts "#{@pfexec} zfs send -r #{datasetpath}/boot@vagrant_box#{datetime} > #{destination}" if result.zero? && config.debug
|
102
|
+
end
|
103
|
+
|
104
|
+
def metadata_content(brand, _kernel, vcc, boxshortname)
|
105
|
+
<<-ZONEBOX
|
106
|
+
{
|
107
|
+
"provider": "zone",
|
108
|
+
"format": "zss",
|
109
|
+
"brand": "#{brand}",
|
110
|
+
"url": "https://app.vagrantup.com/#{vcc}/boxes/#{boxshortname}"
|
111
|
+
}
|
112
|
+
ZONEBOX
|
113
|
+
end
|
114
|
+
|
115
|
+
def vagrantfile_content(brand, _kernel, datasetpath)
|
116
|
+
<<-ZONEBOX
|
117
|
+
Vagrant.configure('2') do |config|
|
118
|
+
config.vm.provider :zone do |zone|
|
119
|
+
zone.brand = "#{brand}"
|
120
|
+
zone.datasetpath = "#{datasetpath}"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
user_vagrantfile = File.expand_path('../_include/Vagrantfile', __FILE__)
|
124
|
+
load user_vagrantfile if File.exists?(user_vagrantfile)
|
125
|
+
ZONEBOX
|
126
|
+
end
|
127
|
+
|
128
|
+
def assemble_box(boxname, extra)
|
129
|
+
`tar -cvzEf "#{boxname}" ./metadata.json ./Vagrantfile ./box.zss #{extra}`
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'log4r'
|
4
|
+
require 'securerandom'
|
5
|
+
require 'digest/md5'
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module ProviderZone
|
9
|
+
module Action
|
10
|
+
# This is used to prepare NFS ids for NFS Sharing
|
11
|
+
class PrepareNFSValidIds
|
12
|
+
def initialize(app, _env)
|
13
|
+
@logger = Log4r::Logger.new('vagrant_zones::action::prepare_nfs_valid_ids')
|
14
|
+
@app = app
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
env[:nfs_valid_ids] = [env[:machine].id]
|
19
|
+
@app.call(env)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'log4r'
|
4
|
+
require 'vagrant-zones/util/timer'
|
5
|
+
require 'vagrant/util/retryable'
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module ProviderZone
|
9
|
+
module Action
|
10
|
+
# This is used to restart the zone
|
11
|
+
class Restart
|
12
|
+
include Vagrant::Util::Retryable
|
13
|
+
def initialize(app, _env)
|
14
|
+
@logger = Log4r::Logger.new('vagrant_zones::action::restart')
|
15
|
+
@app = app
|
16
|
+
end
|
17
|
+
|
18
|
+
def call(env)
|
19
|
+
@machine = env[:machine]
|
20
|
+
@driver = @machine.provider.driver
|
21
|
+
ui = env[:ui]
|
22
|
+
ui.info(I18n.t('vagrant_zones.graceful_restart'))
|
23
|
+
@driver.control(ui, 'restart')
|
24
|
+
|
25
|
+
env[:metrics] ||= {}
|
26
|
+
env[:metrics]['instance_ssh_time'] = Util::Timer.time do
|
27
|
+
retryable(on: Errors::TimeoutError, tries: 300) do
|
28
|
+
# If we're interrupted don't worry about waiting
|
29
|
+
next if env[:interrupted]
|
30
|
+
|
31
|
+
loop do
|
32
|
+
break if env[:interrupted]
|
33
|
+
break unless env[:machine].communicate.ready?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
ui.info(I18n.t('vagrant_zones.zone_gracefully_stopped_waiting_for_boot'))
|
39
|
+
env[:metrics] ||= {}
|
40
|
+
env[:metrics]['instance_ssh_time'] = Util::Timer.time do
|
41
|
+
retryable(on: Errors::TimeoutError, tries: 300) do
|
42
|
+
# If we're interrupted don't worry about waiting
|
43
|
+
next if env[:interrupted]
|
44
|
+
break if env[:machine].communicate.ready?
|
45
|
+
end
|
46
|
+
end
|
47
|
+
ui.info(I18n.t('vagrant_zones.zone_gracefully_restarted'))
|
48
|
+
@app.call(env)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'log4r'
|
4
|
+
require 'securerandom'
|
5
|
+
require 'digest/md5'
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module ProviderZone
|
9
|
+
module Action
|
10
|
+
# This is used to setup the zone
|
11
|
+
class Setup
|
12
|
+
def initialize(app, _env)
|
13
|
+
@logger = Log4r::Logger.new('vagrant_zones::action::import')
|
14
|
+
@app = app
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
@machine = env[:machine]
|
19
|
+
@driver = @machine.provider.driver
|
20
|
+
@driver.setup(env[:ui])
|
21
|
+
@app.call(env)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'log4r'
|
4
|
+
require 'vagrant-zones/util/timer'
|
5
|
+
require 'vagrant/util/retryable'
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module ProviderZone
|
9
|
+
module Action
|
10
|
+
# This is used to shutdown the zone
|
11
|
+
class Shutdown
|
12
|
+
include Vagrant::Util::Retryable
|
13
|
+
def initialize(app, _env)
|
14
|
+
@logger = Log4r::Logger.new('vagrant_zones::action::shutdown')
|
15
|
+
@app = app
|
16
|
+
end
|
17
|
+
|
18
|
+
def call(env)
|
19
|
+
@machine = env[:machine]
|
20
|
+
@driver = @machine.provider.driver
|
21
|
+
ui = env[:ui]
|
22
|
+
ui.info(I18n.t('vagrant_zones.graceful_shutdown_started'))
|
23
|
+
@driver.control(ui, 'shutdown')
|
24
|
+
env[:metrics] ||= {}
|
25
|
+
env[:metrics]['instance_ssh_time'] = Util::Timer.time do
|
26
|
+
retryable(on: Errors::TimeoutError, tries: 300) do
|
27
|
+
# If we're interrupted don't worry about waiting
|
28
|
+
break if env[:interrupted]
|
29
|
+
break unless env[:machine].communicate.ready?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
env[:metrics]['instance_ssh_time'] = Util::Timer.time do
|
33
|
+
300.times do
|
34
|
+
state_id = @driver.state(@machine)
|
35
|
+
ui.info(I18n.t('vagrant_zones.graceful_shutdown_complete')) unless state_id == :running
|
36
|
+
sleep 1 if state_id == :running
|
37
|
+
break unless state_id == :running
|
38
|
+
break if env[:interrupted]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
@driver.halt(env[:ui])
|
42
|
+
@app.call(env)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|