vagrant-zones 0.0.1

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.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. data/.github/dependabot.yml +6 -0
  5. data/.github/workflows/codeql-analysis.yml +72 -0
  6. data/.github/workflows/lint-release-and-publish.yml +70 -0
  7. data/.github/workflows/ruby-lint.yml +35 -0
  8. data/.gitignore +35 -0
  9. data/.rspec +2 -0
  10. data/.rubocop.yml +143 -0
  11. data/CHANGELOG.md +0 -0
  12. data/CODE_OF_CONDUCT.md +128 -0
  13. data/CONTRIBUTING.md +96 -0
  14. data/Gemfile +14 -0
  15. data/LICENSE +651 -0
  16. data/PULL_REQUEST_TEMPLATE.md +39 -0
  17. data/README.md +81 -0
  18. data/RELEASE.md +15 -0
  19. data/Rakefile +32 -0
  20. data/SECURITY.md +19 -0
  21. data/docs/CNAME +1 -0
  22. data/docs/_config.yml +1 -0
  23. data/docs/css/main.css +55 -0
  24. data/docs/css/styles.css +8678 -0
  25. data/docs/index.html +127 -0
  26. data/lib/vagrant-zones/action/create.rb +29 -0
  27. data/lib/vagrant-zones/action/destroy.rb +27 -0
  28. data/lib/vagrant-zones/action/halt.rb +24 -0
  29. data/lib/vagrant-zones/action/import.rb +112 -0
  30. data/lib/vagrant-zones/action/is_created.rb +22 -0
  31. data/lib/vagrant-zones/action/network.rb +26 -0
  32. data/lib/vagrant-zones/action/not_created.rb +20 -0
  33. data/lib/vagrant-zones/action/package.rb +134 -0
  34. data/lib/vagrant-zones/action/prepare_nfs_valid_ids.rb +24 -0
  35. data/lib/vagrant-zones/action/restart.rb +53 -0
  36. data/lib/vagrant-zones/action/setup.rb +26 -0
  37. data/lib/vagrant-zones/action/shutdown.rb +47 -0
  38. data/lib/vagrant-zones/action/start.rb +25 -0
  39. data/lib/vagrant-zones/action/wait_till_boot.rb +59 -0
  40. data/lib/vagrant-zones/action/wait_till_up.rb +65 -0
  41. data/lib/vagrant-zones/action.rb +204 -0
  42. data/lib/vagrant-zones/command/configure_snapshots.rb +49 -0
  43. data/lib/vagrant-zones/command/console.rb +63 -0
  44. data/lib/vagrant-zones/command/create_snapshots.rb +46 -0
  45. data/lib/vagrant-zones/command/delete_snapshots.rb +38 -0
  46. data/lib/vagrant-zones/command/guest_power_controls.rb +58 -0
  47. data/lib/vagrant-zones/command/list_snapshots.rb +44 -0
  48. data/lib/vagrant-zones/command/restart_guest.rb +29 -0
  49. data/lib/vagrant-zones/command/shutdown_guest.rb +29 -0
  50. data/lib/vagrant-zones/command/vnc_console.rb +48 -0
  51. data/lib/vagrant-zones/command/webvnc_console.rb +49 -0
  52. data/lib/vagrant-zones/command/zfssnapshot.rb +67 -0
  53. data/lib/vagrant-zones/command/zlogin_console.rb +40 -0
  54. data/lib/vagrant-zones/command/zone.rb +73 -0
  55. data/lib/vagrant-zones/config.rb +78 -0
  56. data/lib/vagrant-zones/driver.rb +1710 -0
  57. data/lib/vagrant-zones/errors.rb +61 -0
  58. data/lib/vagrant-zones/executor.rb +38 -0
  59. data/lib/vagrant-zones/plugin.rb +79 -0
  60. data/lib/vagrant-zones/provider.rb +83 -0
  61. data/lib/vagrant-zones/util/subprocess.rb +31 -0
  62. data/lib/vagrant-zones/util/timer.rb +19 -0
  63. data/lib/vagrant-zones/version.rb +7 -0
  64. data/lib/vagrant-zones.rb +29 -0
  65. data/locales/en.yml +326 -0
  66. data/vagrant-zones.gemspec +51 -0
  67. metadata +412 -0
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'log4r'
4
+
5
+ module VagrantPlugins
6
+ module ProviderZone
7
+ module Action
8
+ # This is used to start the zone
9
+ class Start
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.check_zone_support(env[:ui])
19
+ @driver.boot(env[:ui])
20
+ @app.call(env)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,59 @@
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 wait till the zone is booted
11
+ class WaitTillBoot
12
+ include Vagrant::Util::Retryable
13
+
14
+ def initialize(app, _env)
15
+ @logger = Log4r::Logger.new('vagrant_zones::action::import')
16
+ @app = app
17
+ end
18
+
19
+ def terminate(env)
20
+ return unless env[:machine].state.id != :not_created
21
+
22
+ # If we're not supposed to destroy on error then just return
23
+ return unless env[:destroy_on_error]
24
+
25
+ if env[:halt_on_error]
26
+ halt_env = env.dup
27
+ halt_env.delete(:interrupted)
28
+ halt_env[:config_validate] = false
29
+ env[:action_runner].run(Action.action_halt, halt_env)
30
+ else
31
+ destroy_env = env.dup
32
+ destroy_env.delete(:interrupted)
33
+ destroy_env[:config_validate] = false
34
+ destroy_env[:force_confirm_destroy] = true
35
+ env[:action_runner].run(Action.action_destroy, destroy_env)
36
+ end
37
+ end
38
+
39
+ def call(env)
40
+ @machine = env[:machine]
41
+ @driver = @machine.provider.driver
42
+ ui = env[:ui]
43
+ # Initialize metrics if they haven't been
44
+ env[:metrics] ||= {}
45
+ env[:metrics]['instance_boot_time'] = Util::Timer.time do
46
+ next if env[:interrupted]
47
+
48
+ breakwait = @driver.waitforboot(ui, env[:metrics], env[:interrupted])
49
+ ui.info(I18n.t('vagrant_zones.boot_ready') + " in #{env[:metrics]['instance_boot_time']} Seconds") if breakwait
50
+ break if breakwait
51
+ end
52
+ return terminate(env) if env[:interrupted]
53
+
54
+ @app.call(env)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,65 @@
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 wait till the zone is booted
11
+ class WaitTillUp
12
+ include Vagrant::Util::Retryable
13
+
14
+ def initialize(app, _env)
15
+ @logger = Log4r::Logger.new('vagrant_zones::action::import')
16
+ @app = app
17
+ end
18
+
19
+ def terminate(env)
20
+ return unless env[:machine].state.id != :not_created
21
+
22
+ # If we're not supposed to destroy on error then just return
23
+ return unless env[:destroy_on_error]
24
+
25
+ if env[:halt_on_error]
26
+ halt_env = env.dup
27
+ halt_env.delete(:interrupted)
28
+ halt_env[:config_validate] = false
29
+ env[:action_runner].run(Action.action_halt, halt_env)
30
+ else
31
+ destroy_env = env.dup
32
+ destroy_env.delete(:interrupted)
33
+ destroy_env[:config_validate] = false
34
+ destroy_env[:force_confirm_destroy] = true
35
+ env[:action_runner].run(Action.action_destroy, destroy_env)
36
+ end
37
+ end
38
+
39
+ def call(env)
40
+ @machine = env[:machine]
41
+ @driver = @machine.provider.driver
42
+ ui = env[:ui]
43
+ # Initialize metrics if they haven't been
44
+ env[:metrics] ||= {}
45
+ env[:metrics]['instance_ssh_time'] = Util::Timer.time do
46
+ retryable(on: Errors::TimeoutError, tries: 60) do
47
+ # If we're interrupted don't worry about waiting
48
+ next if env[:interrupted]
49
+
50
+ loop do
51
+ break if env[:interrupted]
52
+ break if env[:machine].communicate.ready?
53
+ end
54
+ end
55
+ end
56
+ # if interrupted above, just terminate immediately
57
+ return terminate(env) if env[:interrupted]
58
+
59
+ ui.info(I18n.t('vagrant_zones.ssh_ready') + " in #{env[:metrics]['instance_ssh_time']} Seconds")
60
+ @app.call(env)
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,204 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'vagrant/action/builder'
4
+ require 'log4r'
5
+
6
+ module VagrantPlugins
7
+ module ProviderZone
8
+ # Run actions against the machine
9
+ module Action
10
+ include Vagrant::Action::Builtin
11
+ @logger = Log4r::Logger.new('vagrant_zones::action')
12
+
13
+ # This action is called to bring the box up from nothing.
14
+ def self.action_up
15
+ Vagrant::Action::Builder.new.tap do |b|
16
+ b.use Call, IsCreated do |env, b2|
17
+ if env[:result]
18
+ env[:halt_on_error] = true
19
+ b2.use action_start
20
+ elsif !env[:result]
21
+ b2.use Import
22
+ b2.use HandleBox
23
+ b2.use BoxCheckOutdated
24
+ b2.use Create
25
+ b2.use Network
26
+ b2.use Start
27
+ b2.use WaitTillBoot
28
+ b2.use Setup
29
+ b2.use WaitTillUp
30
+ b2.use Provision
31
+ b2.use SetHostname
32
+ b2.use SyncedFolders
33
+ b2.use SyncedFolderCleanup
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ # Assuming VM is created, just start it. This action is not called directly by any subcommand.
40
+ def self.action_start
41
+ Vagrant::Action::Builder.new.tap do |b|
42
+ b.use Call, IsState, :running do |env, b1|
43
+ if env[:result]
44
+ b1.use Message, I18n.t('vagrant_zones.states.is_running')
45
+ next
46
+ end
47
+ b1.use Call, IsState, :uncleaned do |env2, b2|
48
+ b2.use Cleanup if env2[:result]
49
+ end
50
+ b1.use Start
51
+ b1.use WaitTillUp
52
+ end
53
+ end
54
+ end
55
+
56
+ def self.action_restart
57
+ Vagrant::Action::Builder.new.tap do |b|
58
+ b.use Call, IsCreated do |_env, b2|
59
+ b2.use Call, IsState, :stopped do |env2, b3|
60
+ unless env2[:result]
61
+ b3.use WaitTillUp
62
+ b3.use Restart
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ def self.action_shutdown
70
+ Vagrant::Action::Builder.new.tap do |b|
71
+ b.use Call, IsCreated do |_env, b2|
72
+ b2.use Call, IsState, :stopped do |env2, b3|
73
+ unless env2[:result]
74
+ b3.use WaitTillUp
75
+ b3.use Shutdown
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ # This is the action that is primarily responsible for halting the virtual machine.
83
+ def self.action_halt
84
+ Vagrant::Action::Builder.new.tap do |b|
85
+ b.use Call, IsCreated do |env, b2|
86
+ unless env[:result]
87
+ b2.use NotCreated
88
+ next
89
+ end
90
+ b2.use Halt if env[:result]
91
+ end
92
+ end
93
+ end
94
+
95
+ # This action is called to SSH into the machine.
96
+ def self.action_ssh
97
+ Vagrant::Action::Builder.new.tap do |b|
98
+ b.use SSHExec
99
+ end
100
+ end
101
+
102
+ def self.action_ssh_run
103
+ Vagrant::Action::Builder.new.tap do |b|
104
+ b.use SSHRun
105
+ end
106
+ end
107
+
108
+ # This action is called when you try to package an existing virtual machine to an box image.
109
+ def self.action_package
110
+ Vagrant::Action::Builder.new.tap do |b|
111
+ b.use Package
112
+ end
113
+ end
114
+
115
+ # This is the action that is primarily responsible for completely freeing the resources of the underlying virtual machine.
116
+ def self.action_destroy
117
+ Vagrant::Action::Builder.new.tap do |b|
118
+ b.use Call, IsCreated do |_env, b2|
119
+ b2.use Destroy
120
+ end
121
+ end
122
+ end
123
+
124
+ # This action is called when `vagrant provision` is called.
125
+ def self.action_provision
126
+ Vagrant::Action::Builder.new.tap do |b|
127
+ b.use Call, IsCreated do |_env, b2|
128
+ b2.use Call, IsState, :running do |_env2, b3|
129
+ b3.use Provision
130
+ end
131
+ end
132
+ end
133
+ end
134
+
135
+ # This is the action implements the reload command It uses the halt and start actions
136
+ def self.action_reload
137
+ Vagrant::Action::Builder.new.tap do |b|
138
+ b.use Call, IsCreated do |env, b2|
139
+ unless env[:result]
140
+ b2.use NotCreated
141
+ next
142
+ end
143
+ b2.use action_halt
144
+ b2.use action_start
145
+ end
146
+ end
147
+ end
148
+
149
+ def self.action_create_zfs_snapshots
150
+ Vagrant::Action::Builder.new.tap do |b|
151
+ # b.use ConfigValidate # is this per machine?
152
+ b.use CreateSnapshots
153
+ end
154
+ end
155
+
156
+ def self.action_delete_zfs_snapshots
157
+ Vagrant::Action::Builder.new.tap do |b|
158
+ b.use DeleteSnapshots
159
+ end
160
+ end
161
+
162
+ def self.action_configure_zfs_snapshots
163
+ Vagrant::Action::Builder.new.tap do |b|
164
+ b.use ConfigureSnapshots
165
+ end
166
+ end
167
+
168
+ def self.action_box_outdated
169
+ Builder.new.tap do |b|
170
+ b.use Builtin::BoxCheckOutdated
171
+ end
172
+ end
173
+
174
+ # This is the action that will remove a box given a name (and optionally
175
+ # a provider). This middleware sequence is built-in to Vagrant. Plugins
176
+ # can hook into this like any other middleware sequence.
177
+ def self.action_box_remove
178
+ Builder.new.tap do |b|
179
+ b.use Builtin::BoxRemove
180
+ end
181
+ end
182
+
183
+ action_root = Pathname.new(File.expand_path('action', __dir__))
184
+ autoload :Import, action_root.join('import')
185
+ autoload :Create, action_root.join('create')
186
+ autoload :Network, action_root.join('network')
187
+ autoload :Setup, action_root.join('setup')
188
+ autoload :Start, action_root.join('start')
189
+ autoload :IsCreated, action_root.join('is_created')
190
+ autoload :NotCreated, action_root.join('not_created')
191
+ autoload :CreateSnapshots, action_root.join('create_zfs_snapshots')
192
+ autoload :DeleteSnapshots, action_root.join('delete_zfs_snapshots')
193
+ autoload :ConfigureSnapshots, action_root.join('configure_zfs_snapshots')
194
+ autoload :Halt, action_root.join('halt')
195
+ autoload :Destroy, action_root.join('destroy')
196
+ autoload :WaitTillBoot, action_root.join('wait_till_boot')
197
+ autoload :WaitTillUp, action_root.join('wait_till_up')
198
+ autoload :Restart, action_root.join('restart')
199
+ autoload :Shutdown, action_root.join('shutdown')
200
+ autoload :PrepareNFSValidIds, action_root.join('prepare_nfs_valid_ids.rb')
201
+ autoload :Package, action_root.join('package.rb')
202
+ end
203
+ end
204
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VagrantPlugins
4
+ module ProviderZone
5
+ module Command
6
+ # This is used to configure snapshots for the zone
7
+ class ConfigureSnapshots < Vagrant.plugin('2', :command)
8
+ def execute
9
+ options = {}
10
+ opts = OptionParser.new do |o|
11
+ o.banner = 'Usage: vagrant zone zfssnapshot list [options]'
12
+ o.on('--dataset DATASETPATH/ALL', 'Specify path to enable snapshots on, defaults to ALL') do |p|
13
+ options[:dataset] = p
14
+ end
15
+ frequencymsg = 'Set a policy with one of the available optional frequencies'
16
+ o.on('--set_frequency <hourly/daily/weekly/monthly/all>', frequencymsg) do |p|
17
+ options[:set_frequency] = p
18
+ end
19
+ frequency_rtnmsg = 'Number of snapshots to take for the frequency policy'
20
+ o.on('--set_frequency_rtn <#>/defaults ', frequency_rtnmsg) do |p|
21
+ options[:set_frequency_rtn] = p
22
+ end
23
+ deletemsg = 'Delete frequency policy'
24
+ o.on('--delete <hourly/daily/weekly/monthly/all>', deletemsg) do |p|
25
+ options[:delete] = p
26
+ end
27
+ listmsg = 'Show Cron Policies'
28
+ o.on('--list <hourly/daily/weekly/monthly/all>', listmsg) do |p|
29
+ options[:list] = p
30
+ end
31
+ end
32
+
33
+ argv = parse_options(opts)
34
+ return unless argv
35
+
36
+ unless argv.length <= 4
37
+ @env.ui.info(opts.help)
38
+ return
39
+ end
40
+
41
+ with_target_vms(argv, provider: :zone) do |machine|
42
+ driver = machine.provider.driver
43
+ driver.zfs(@env.ui, 'cron', options)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VagrantPlugins
4
+ module ProviderZone
5
+ module Command
6
+ # This is used to start a console to the zone via WebVNC, VNC or Serial/Telnet
7
+ class Console < Vagrant.plugin('2', :command)
8
+ def initialize(argv, env)
9
+ @main_args, @sub_command, @sub_args = split_main_and_subcommand(argv)
10
+
11
+ @subcommands = Vagrant::Registry.new
12
+ @subcommands.register(:vnc) do
13
+ require File.expand_path('vnc_console', __dir__)
14
+ VNCConsole
15
+ end
16
+ @subcommands.register(:zlogin) do
17
+ require File.expand_path('zlogin_console', __dir__)
18
+ ZloginConsole
19
+ end
20
+ @subcommands.register(:webvnc) do
21
+ require File.expand_path('webvnc_console', __dir__)
22
+ WebVNCConsole
23
+ end
24
+ super(argv, env)
25
+ end
26
+
27
+ def execute
28
+ if @main_args.include?('-h') || @main_args.include?('--help')
29
+ # Print the help for all the vagrant-zones commands.
30
+ return help
31
+ end
32
+
33
+ with_target_vms(@main_args, provider: :zone) do |machine|
34
+ @sub_command = machine.provider_config.console.to_sym unless machine.provider_config.console.nil? || @sub_command
35
+ command_class = @subcommands.get(@sub_command.to_sym) if @sub_command
36
+ @logger.debug("Invoking command class: #{command_class} #{machine.provider_config.console.to_sym}")
37
+ return help if !command_class || !@sub_command
38
+
39
+ # Initialize and execute the command class
40
+ command_class.new(@sub_args, @env).execute
41
+ end
42
+ end
43
+
44
+ def help
45
+ opts = OptionParser.new do |subopts|
46
+ subopts.banner = 'Usage: vagrant zone console <subcommand> [<args>]'
47
+ subopts.separator ''
48
+ subopts.separator 'Available subcommands:'
49
+ # Add the available subcommands as separators in order to print them
50
+ # out as well.
51
+ keys = []
52
+ @subcommands.each { |key, _value| keys << key.to_s }
53
+ keys.sort.each do |key|
54
+ subopts.separator " #{key}"
55
+ end
56
+ subopts.separator 'For help on any individual subcommand run `vagrant zone console <subcommand> -h`'
57
+ end
58
+ @env.ui.info(opts.help, :prefix => false)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VagrantPlugins
4
+ module ProviderZone
5
+ module Command
6
+ # This is used to create zfs snapshots the zone
7
+ class CreateSnapshots < Vagrant.plugin('2', :command)
8
+ def execute
9
+ options = {}
10
+ opts = OptionParser.new do |o|
11
+ o.banner = 'Usage: vagrant zone zfssnapshot list [options]'
12
+ o.on('--dataset SNAPSHOTPATH', 'Specify snapshot path') do |p|
13
+ options[:dataset] = p
14
+ end
15
+ o.on('--snapshot_name @SNAPSHOTNAME', 'Specify snapshot name') do |p|
16
+ options[:snapshot_name] = p
17
+ end
18
+ end
19
+
20
+ argv = parse_options(opts)
21
+ return unless argv
22
+
23
+ unless argv.length <= 4
24
+ @env.ui.info(opts.help)
25
+ return
26
+ end
27
+
28
+ options[:dataset] = 'all' if options[:dataset].nil?
29
+
30
+ if options[:snapshot_name].nil?
31
+ t = Time.new
32
+ dash = '-'
33
+ colon = ':'
34
+ datetime = t.year.to_s + dash + t.month.to_s + dash + t.day.to_s + dash + t.hour.to_s + colon + t.min.to_s + colon + t.sec.to_s
35
+ options[:snapshot_name] = datetime
36
+ end
37
+
38
+ with_target_vms(argv, provider: :zone) do |machine|
39
+ driver = machine.provider.driver
40
+ driver.zfs(@env.ui, 'create', options)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VagrantPlugins
4
+ module ProviderZone
5
+ module Command
6
+ # This is used to delete zfs snapshots the zone
7
+ class DeleteSnapshots < Vagrant.plugin('2', :command)
8
+ def execute
9
+ options = {}
10
+ opts = OptionParser.new do |o|
11
+ o.banner = 'Usage: vagrant zone zfssnapshot list [options]'
12
+ o.on('--dataset DATASETPATH', 'Specify snapshot path') do |p|
13
+ options[:dataset] = p
14
+ end
15
+ o.on('--snapshot_name @SNAPSHOTNAME', 'Specify snapshot name') do |p|
16
+ options[:snapshot_name] = p
17
+ end
18
+ end
19
+
20
+ argv = parse_options(opts)
21
+ return unless argv
22
+
23
+ unless argv.length <= 4
24
+ @env.ui.info(opts.help)
25
+ return
26
+ end
27
+
28
+ options[:dataset] = 'all' if options[:dataset].nil?
29
+ options[:snapshot_name] = 'all' if options[:snapshot_name].nil?
30
+ with_target_vms(argv, provider: :zone) do |machine|
31
+ driver = machine.provider.driver
32
+ driver.zfs(@env.ui, 'destroy', options)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VagrantPlugins
4
+ module ProviderZone
5
+ module Command
6
+ # This is used to manage the power controls for the zone
7
+ class GuestPowerControls < Vagrant.plugin('2', :command)
8
+ def initialize(argv, env)
9
+ @main_args, @sub_command, @sub_args = split_main_and_subcommand(argv)
10
+
11
+ @subcommands = Vagrant::Registry.new
12
+ @subcommands.register(:restart) do
13
+ require File.expand_path('restart_guest', __dir__)
14
+ RestartGuest
15
+ end
16
+ @subcommands.register(:shutdown) do
17
+ require File.expand_path('shutdown_guest', __dir__)
18
+ ShutdownGuest
19
+ end
20
+ super(argv, env)
21
+ end
22
+
23
+ def execute
24
+ if @main_args.include?('-h') || @main_args.include?('--help')
25
+ # Print the help for all the vagrant-zones commands.
26
+ return help
27
+ end
28
+
29
+ command_class = @subcommands.get(@sub_command.to_sym) if @sub_command
30
+ return help if !command_class || !@sub_command
31
+
32
+ @logger.debug("Invoking command class: #{command_class} #{@sub_args.inspect}")
33
+
34
+ # Initialize and execute the command class
35
+ command_class.new(@sub_args, @env).execute
36
+ end
37
+
38
+ def help
39
+ opts = OptionParser.new do |subopts|
40
+ subopts.banner = 'Usage: vagrant zone control <subcommand> [<args>]'
41
+ subopts.separator ''
42
+ subopts.separator 'Available subcommands:'
43
+ # Add the available subcommands as separators in order to print them
44
+ # out as well.
45
+ keys = []
46
+ @subcommands.each { |key, _value| keys << key.to_s }
47
+ keys.sort.each do |key|
48
+ subopts.separator " #{key}"
49
+ end
50
+ subopts.separator ''
51
+ subopts.separator 'For help on any individual subcommand run `vagrant zone control <subcommand> -h`'
52
+ end
53
+ @env.ui.info(opts.help, :prefix => false)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VagrantPlugins
4
+ module ProviderZone
5
+ module Command
6
+ # This is used to list snapshots for the zone
7
+ class ListSnapshots < Vagrant.plugin('2', :command)
8
+ def execute
9
+ options = {}
10
+ opts = OptionParser.new do |o|
11
+ o.banner = 'Usage: vagrant zone zfssnapshot list [options]'
12
+ o.on('--dataset SNAPSHOTPATH', 'Specify snapshot path') do |p|
13
+ options[:dataset] = p
14
+ end
15
+ o.on('--snapshot_name @SNAPSHOTNAME', 'Specify snapshot name') do |p|
16
+ options[:snapshot_name] = p
17
+ end
18
+ end
19
+
20
+ argv = parse_options(opts)
21
+ return unless argv
22
+
23
+ unless argv.length <= 2
24
+ @env.ui.info(opts.help)
25
+ return
26
+ end
27
+
28
+ if options[:snapshot_name].nil?
29
+ t = Time.new
30
+ dash = '-'
31
+ colon = ':'
32
+ datetime = t.year.to_s + dash + t.month.to_s + dash + t.day.to_s + dash + t.hour.to_s + colon + t.min.to_s + colon + t.sec.to_s
33
+ options[:snapshot_name] = datetime
34
+ end
35
+
36
+ with_target_vms(argv, provider: :zone) do |machine|
37
+ driver = machine.provider.driver
38
+ driver.zfs(@env.ui, 'list', options)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VagrantPlugins
4
+ module ProviderZone
5
+ module Command
6
+ # This is used to restart the guest from inside the guest
7
+ class RestartGuest < Vagrant.plugin('2', :command)
8
+ def execute
9
+ opts = OptionParser.new do |o|
10
+ o.banner = 'Usage: vagrant zone control restart [options]'
11
+ end
12
+
13
+ argv = parse_options(opts)
14
+ return unless argv
15
+
16
+ unless argv.empty?
17
+ @env.ui.info(opts.help)
18
+ return
19
+ end
20
+
21
+ ## Wait for VM up
22
+ with_target_vms(argv, provider: :zone) do |machine|
23
+ machine.action('restart')
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end