vagrant-zones 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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