vagrant-smartos-zones 0.0.1.pre.21
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 +7 -0
- data/.gitignore +19 -0
- data/.rubocop.yml +12 -0
- data/Gemfile +12 -0
- data/LICENSE.txt +22 -0
- data/README.md +268 -0
- data/Rakefile +6 -0
- data/Vagrantfile +29 -0
- data/examples/Vagrantfile +18 -0
- data/examples/Vagrantfile.chef_server +33 -0
- data/examples/Vagrantfile.lx +22 -0
- data/examples/Vagrantfile.rsync +23 -0
- data/files/gz_vnic/create_gz_vnic +15 -0
- data/files/smf/create-gz-vnic.xml +31 -0
- data/files/smf/zonegate.xml +34 -0
- data/files/zonegate/zonegate +60 -0
- data/files/zonegate/zonemon +15 -0
- data/files/zonegate/zonenat +153 -0
- data/lib/vagrant/smartos/locales/en.yml +41 -0
- data/lib/vagrant/smartos/zones/action/configure_zone_synced_folders.rb +53 -0
- data/lib/vagrant/smartos/zones/action/create_gz_vnic.rb +28 -0
- data/lib/vagrant/smartos/zones/action/forward_gz_ports.rb +46 -0
- data/lib/vagrant/smartos/zones/action/helper.rb +33 -0
- data/lib/vagrant/smartos/zones/action/imgadm_import.rb +24 -0
- data/lib/vagrant/smartos/zones/action/virtualbox/platform_iso.rb +57 -0
- data/lib/vagrant/smartos/zones/action/zone/create.rb +25 -0
- data/lib/vagrant/smartos/zones/action/zone/start.rb +25 -0
- data/lib/vagrant/smartos/zones/action/zone/stop.rb +25 -0
- data/lib/vagrant/smartos/zones/action/zone_gate/enable.rb +26 -0
- data/lib/vagrant/smartos/zones/action/zone_gate/install.rb +26 -0
- data/lib/vagrant/smartos/zones/action.rb +75 -0
- data/lib/vagrant/smartos/zones/cap/base.rb +29 -0
- data/lib/vagrant/smartos/zones/cap/create_gz_vnic.rb +45 -0
- data/lib/vagrant/smartos/zones/cap/imgadm_import.rb +30 -0
- data/lib/vagrant/smartos/zones/cap/platform_image/install.rb +17 -0
- data/lib/vagrant/smartos/zones/cap/platform_image/latest.rb +19 -0
- data/lib/vagrant/smartos/zones/cap/platform_image/list.rb +17 -0
- data/lib/vagrant/smartos/zones/cap/zone/base.rb +32 -0
- data/lib/vagrant/smartos/zones/cap/zone/create.rb +45 -0
- data/lib/vagrant/smartos/zones/cap/zone/start.rb +29 -0
- data/lib/vagrant/smartos/zones/cap/zone/stop.rb +29 -0
- data/lib/vagrant/smartos/zones/cap/zone_gate/enable.rb +20 -0
- data/lib/vagrant/smartos/zones/cap/zone_gate/install.rb +46 -0
- data/lib/vagrant/smartos/zones/commands/dataset.rb +91 -0
- data/lib/vagrant/smartos/zones/commands/global_zone.rb +43 -0
- data/lib/vagrant/smartos/zones/commands/multi_command.rb +46 -0
- data/lib/vagrant/smartos/zones/commands/smartos.rb +70 -0
- data/lib/vagrant/smartos/zones/commands/zlogin.rb +35 -0
- data/lib/vagrant/smartos/zones/commands/zones.rb +136 -0
- data/lib/vagrant/smartos/zones/communicator/smartos.rb +87 -0
- data/lib/vagrant/smartos/zones/config/global_zone.rb +26 -0
- data/lib/vagrant/smartos/zones/config/zone.rb +33 -0
- data/lib/vagrant/smartos/zones/errors.rb +9 -0
- data/lib/vagrant/smartos/zones/guest.rb +25 -0
- data/lib/vagrant/smartos/zones/hooks.rb +41 -0
- data/lib/vagrant/smartos/zones/models/dataset.rb +27 -0
- data/lib/vagrant/smartos/zones/models/snapshot.rb +71 -0
- data/lib/vagrant/smartos/zones/models/zone.rb +80 -0
- data/lib/vagrant/smartos/zones/models/zone_group.rb +11 -0
- data/lib/vagrant/smartos/zones/models/zone_user.rb +11 -0
- data/lib/vagrant/smartos/zones/plugin.rb +118 -0
- data/lib/vagrant/smartos/zones/util/checksum.rb +22 -0
- data/lib/vagrant/smartos/zones/util/downloader.rb +48 -0
- data/lib/vagrant/smartos/zones/util/global_zone/connection.rb +192 -0
- data/lib/vagrant/smartos/zones/util/global_zone/helper.rb +33 -0
- data/lib/vagrant/smartos/zones/util/global_zone/ssh_info.rb +85 -0
- data/lib/vagrant/smartos/zones/util/platform_images.rb +132 -0
- data/lib/vagrant/smartos/zones/util/public_key.rb +14 -0
- data/lib/vagrant/smartos/zones/util/snapshots.rb +63 -0
- data/lib/vagrant/smartos/zones/util/zone_group.rb +34 -0
- data/lib/vagrant/smartos/zones/util/zone_info.rb +72 -0
- data/lib/vagrant/smartos/zones/util/zone_json.rb +77 -0
- data/lib/vagrant/smartos/zones/util/zone_project.rb +25 -0
- data/lib/vagrant/smartos/zones/util/zone_user.rb +63 -0
- data/lib/vagrant/smartos/zones/version.rb +7 -0
- data/lib/vagrant/smartos/zones.rb +10 -0
- data/vagrant-smartos-zones.gemspec +24 -0
- metadata +163 -0
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
require 'vagrant/smartos/zones/errors'
|
3
|
+
require 'vagrant/smartos/zones/models/zone'
|
4
|
+
require 'vagrant/smartos/zones/util/snapshots'
|
5
|
+
require 'vagrant/smartos/zones/util/zone_info'
|
6
|
+
require_relative 'multi_command'
|
7
|
+
|
8
|
+
module Vagrant
|
9
|
+
module Smartos
|
10
|
+
module Zones
|
11
|
+
module Command
|
12
|
+
class Zones < Vagrant.plugin('2', :command)
|
13
|
+
include MultiCommand
|
14
|
+
|
15
|
+
COMMANDS = %w(create destroy list show snapshot start stop).freeze
|
16
|
+
|
17
|
+
OPTION_PARSER = OptionParser.new do |o|
|
18
|
+
o.banner = 'Usage: vagrant zones [command] [name]'
|
19
|
+
o.separator ''
|
20
|
+
o.separator 'Commands:'
|
21
|
+
o.separator ' list show status of zones'
|
22
|
+
o.separator ' create [name] create or update zone with alias [name]'
|
23
|
+
o.separator ' destroy [name] delete zone with alias [name]'
|
24
|
+
o.separator ' show [name] show info on zone with alias [name]'
|
25
|
+
o.separator ' snapshot [action] [name] [snapshot] snapshot the ZFS filesystem for [name]'
|
26
|
+
o.separator ' actions: list, create, delete, rollback'
|
27
|
+
o.separator ' start [name] start zone with alias [name]'
|
28
|
+
o.separator ' stop [name] stop zone with alias [name]'
|
29
|
+
o.separator ''
|
30
|
+
o.separator 'Options:'
|
31
|
+
o.separator ''
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.synopsis
|
35
|
+
'View and interact with SmartOS zones'
|
36
|
+
end
|
37
|
+
|
38
|
+
def execute
|
39
|
+
process_subcommand
|
40
|
+
end
|
41
|
+
|
42
|
+
def create(name)
|
43
|
+
zones.create(name).tap do |zone|
|
44
|
+
return unless zone
|
45
|
+
@env.ui.info(I18n.t('vagrant.smartos.zones.commands.zones.create',
|
46
|
+
name: zone.name, state: zone.state,
|
47
|
+
uuid: zone.uuid, brand: zone.brand,
|
48
|
+
image: zone.image),
|
49
|
+
prefix: false)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def destroy(name)
|
54
|
+
with_zone(name) do |zone|
|
55
|
+
zone.destroy
|
56
|
+
@env.ui.info(I18n.t('vagrant.smartos.zones.commands.zones.destroyed',
|
57
|
+
name: zone.name, state: zone.state,
|
58
|
+
uuid: zone.uuid, brand: zone.brand,
|
59
|
+
image: zone.image))
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def list(*_args)
|
64
|
+
with_target_vms('default') do |machine|
|
65
|
+
zones = Models::Zone.all(machine).map do |zone|
|
66
|
+
[zone.name.to_s.ljust(25), zone.state.to_s.ljust(10), zone.uuid].join(' ')
|
67
|
+
end
|
68
|
+
@env.ui.info(I18n.t('vagrant.smartos.zones.commands.zones.list',
|
69
|
+
zones: zones.join("\n")), prefix: false)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def show(name)
|
74
|
+
with_zone(name) do |zone|
|
75
|
+
@env.ui.info(I18n.t('vagrant.smartos.zones.commands.zones.show',
|
76
|
+
name: zone.name, state: zone.state,
|
77
|
+
uuid: zone.uuid, brand: zone.brand,
|
78
|
+
image: zone.image),
|
79
|
+
prefix: false)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def snapshot(action = nil, name = nil, snapshot = nil)
|
84
|
+
fail_options! unless action && name
|
85
|
+
with_target_vms('default') do |machine|
|
86
|
+
Util::Snapshots.new(machine, name).run(action, snapshot)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def start(name)
|
91
|
+
with_zone(name) do |zone|
|
92
|
+
zone.start
|
93
|
+
@env.ui.info(I18n.t('vagrant.smartos.zones.commands.zones.start',
|
94
|
+
name: zone.name, state: zone.state,
|
95
|
+
uuid: zone.uuid, brand: zone.brand,
|
96
|
+
image: zone.image))
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def stop(name)
|
101
|
+
with_zone(name) do |zone|
|
102
|
+
zone.stop
|
103
|
+
@env.ui.info(I18n.t('vagrant.smartos.zones.commands.zones.stop',
|
104
|
+
name: zone.name, state: zone.state,
|
105
|
+
uuid: zone.uuid, brand: zone.brand,
|
106
|
+
image: zone.image))
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
private
|
111
|
+
|
112
|
+
def zones
|
113
|
+
zones = nil
|
114
|
+
with_target_vms('default') { |machine| zones = Util::ZoneInfo.new(machine) }
|
115
|
+
zones
|
116
|
+
end
|
117
|
+
|
118
|
+
def ui
|
119
|
+
@env.ui
|
120
|
+
end
|
121
|
+
|
122
|
+
def with_zone(name)
|
123
|
+
with_target_vms('default', single_target: true) do |machine|
|
124
|
+
Models::Zone.find(machine, name).tap do |zone|
|
125
|
+
yield zone
|
126
|
+
end
|
127
|
+
end
|
128
|
+
rescue ZoneNotFound
|
129
|
+
ui.warn(I18n.t('vagrant.smartos.zones.warning.zone_not_found',
|
130
|
+
name: name), prefix: false)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'vagrant/smartos/zones/util/global_zone/connection'
|
2
|
+
|
3
|
+
module Vagrant
|
4
|
+
module Smartos
|
5
|
+
module Zones
|
6
|
+
module Communicator
|
7
|
+
class Smartos < Vagrant.plugin('2').manager.communicators[:ssh]
|
8
|
+
def initialize(machine)
|
9
|
+
@machine = machine
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
# rubocop:disable Metrics/MethodLength
|
14
|
+
def gz_execute(command, opts = {}, &block)
|
15
|
+
opts = {
|
16
|
+
error_check: true,
|
17
|
+
error_class: Vagrant::Errors::VagrantError,
|
18
|
+
error_key: :ssh_bad_exit_status,
|
19
|
+
good_exit: 0,
|
20
|
+
command: command,
|
21
|
+
shell: nil,
|
22
|
+
sudo: false
|
23
|
+
}.merge(opts)
|
24
|
+
|
25
|
+
opts[:good_exit] = Array(opts[:good_exit])
|
26
|
+
|
27
|
+
# Connect via SSH and execute the command in the shell.
|
28
|
+
stdout = ''
|
29
|
+
stderr = ''
|
30
|
+
global_zone_connector.connect
|
31
|
+
|
32
|
+
begin
|
33
|
+
generic_ssh_info = @connection_ssh_info
|
34
|
+
@connection_ssh_info = global_zone_connector.ssh_info
|
35
|
+
|
36
|
+
exit_status = global_zone_connector.with_connection do |connection|
|
37
|
+
shell_opts = {
|
38
|
+
sudo: opts[:sudo],
|
39
|
+
shell: opts[:shell]
|
40
|
+
}
|
41
|
+
|
42
|
+
shell_execute(connection, command, **shell_opts) do |type, data|
|
43
|
+
if type == :stdout
|
44
|
+
stdout += data
|
45
|
+
elsif type == :stderr
|
46
|
+
stderr += data
|
47
|
+
end
|
48
|
+
|
49
|
+
block.call(type, data) if block
|
50
|
+
end
|
51
|
+
end
|
52
|
+
ensure
|
53
|
+
@connection_ssh_info = generic_ssh_info
|
54
|
+
end
|
55
|
+
|
56
|
+
# Check for any errors
|
57
|
+
if opts[:error_check] && !opts[:good_exit].include?(exit_status)
|
58
|
+
# The error classes expect the translation key to be _key,
|
59
|
+
# but that makes for an ugly configuration parameter, so we
|
60
|
+
# set it here from `error_key`
|
61
|
+
error_opts = opts.merge(
|
62
|
+
_key: opts[:error_key],
|
63
|
+
stdout: stdout,
|
64
|
+
stderr: stderr
|
65
|
+
)
|
66
|
+
raise opts[:error_class], error_opts
|
67
|
+
end
|
68
|
+
|
69
|
+
# Return the exit status
|
70
|
+
exit_status
|
71
|
+
end
|
72
|
+
|
73
|
+
def gz_test(command, opts = nil)
|
74
|
+
opts = { error_check: false }.merge(opts || {})
|
75
|
+
gz_execute(command, opts) == 0
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def global_zone_connector
|
81
|
+
@global_zone_connector ||= Vagrant::Smartos::Zones::Util::GlobalZone::Connection.new(@machine, @logger)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
|
3
|
+
module Vagrant
|
4
|
+
module Smartos
|
5
|
+
module Zones
|
6
|
+
module Config
|
7
|
+
class GlobalZone < Vagrant.plugin('2', :config)
|
8
|
+
attr_accessor :platform_image, :platform_image_url, :ssh_port, :forwarded_ssh_port
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@platform_image = UNSET_VALUE
|
12
|
+
@platform_image_url = UNSET_VALUE
|
13
|
+
@ssh_port = UNSET_VALUE
|
14
|
+
@forwarded_ssh_port = UNSET_VALUE
|
15
|
+
end
|
16
|
+
|
17
|
+
def finalize!
|
18
|
+
@platform_image = 'latest' if @platform_image == UNSET_VALUE
|
19
|
+
@ssh_port = 2222 if @ssh_port == UNSET_VALUE
|
20
|
+
@forwarded_ssh_port = 22_022 if @forwarded_ssh_port == UNSET_VALUE
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
|
3
|
+
module Vagrant
|
4
|
+
module Smartos
|
5
|
+
module Zones
|
6
|
+
module Config
|
7
|
+
class Zone < Vagrant.plugin('2', :config)
|
8
|
+
attr_accessor :brand, :disk_size, :image, :kernel_version, :memory, :name
|
9
|
+
attr_reader :synced_folders
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@brand = UNSET_VALUE
|
13
|
+
@disk_size = UNSET_VALUE
|
14
|
+
@image = UNSET_VALUE
|
15
|
+
@kernel_version = UNSET_VALUE
|
16
|
+
@memory = UNSET_VALUE
|
17
|
+
@name = UNSET_VALUE
|
18
|
+
@synced_folders = []
|
19
|
+
end
|
20
|
+
|
21
|
+
def synced_folder(*args)
|
22
|
+
@synced_folders << args
|
23
|
+
end
|
24
|
+
|
25
|
+
def finalize!
|
26
|
+
@brand = 'joyent' if @brand == UNSET_VALUE
|
27
|
+
@kernel_version = '3.16' if @kernel_version == UNSET_VALUE
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
|
3
|
+
module Vagrant
|
4
|
+
module Smartos
|
5
|
+
module Zones
|
6
|
+
class Guest < Vagrant.plugin('2', :guest)
|
7
|
+
TEST_COMMAND = "grep 'SmartOS [0-9]\\{8\\}T[0-9]\\{6\\}Z' /etc/release"
|
8
|
+
|
9
|
+
def detect?(machine)
|
10
|
+
@machine = machine
|
11
|
+
ssh_test || gz_test
|
12
|
+
end
|
13
|
+
|
14
|
+
def ssh_test
|
15
|
+
@machine.communicate.test(TEST_COMMAND)
|
16
|
+
end
|
17
|
+
|
18
|
+
def gz_test
|
19
|
+
return false unless @machine.communicate.respond_to?(:gz_test)
|
20
|
+
@machine.communicate.gz_test(TEST_COMMAND)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# rubocop:disable all
|
2
|
+
module Vagrant
|
3
|
+
module Smartos
|
4
|
+
module Zones
|
5
|
+
class Plugin < Vagrant.plugin("2")
|
6
|
+
manage_zones = lambda do |hook|
|
7
|
+
require_relative 'action'
|
8
|
+
hook.before(::VagrantPlugins::ProviderVirtualBox::Action::PrepareForwardedPortCollisionParams, Vagrant::Smartos::Zones::Action.forward_gz_ports)
|
9
|
+
hook.after(::VagrantPlugins::ProviderVirtualBox::Action::SaneDefaults, Vagrant::Smartos::Zones::Action.virtualbox_platform_iso)
|
10
|
+
hook.before(::VagrantPlugins::ProviderVirtualBox::Action::Network, Vagrant::Smartos::Zones::Action.create_gz_vnic)
|
11
|
+
|
12
|
+
hook.before(Vagrant::Smartos::Zones::Action::CreateGZVnic, Vagrant::Smartos::Zones::Action.install_zone_gate)
|
13
|
+
hook.before(Vagrant::Smartos::Zones::Action::ZoneGate::Install, Vagrant::Smartos::Zones::Action.zone_create)
|
14
|
+
hook.before(Vagrant::Smartos::Zones::Action::Zone::Create, Vagrant::Smartos::Zones::Action.configure_zone_synced_folders)
|
15
|
+
hook.before(Vagrant::Smartos::Zones::Action::Zone::Create, Vagrant::Smartos::Zones::Action.zone_start)
|
16
|
+
|
17
|
+
# Currently if this runs before a zone is created, other capabilities (such as creating zone users)
|
18
|
+
# fail with the error that the machine is not ready for guest communication.
|
19
|
+
hook.before(Vagrant::Smartos::Zones::Action::Zone::Create, Vagrant::Smartos::Zones::Action.enable_zone_gate)
|
20
|
+
hook.after(Vagrant::Smartos::Zones::Action::ConfigureZoneSyncedFolders, Vagrant::Action::Builtin::SyncedFolders)
|
21
|
+
end
|
22
|
+
|
23
|
+
zone_start = lambda do |hook|
|
24
|
+
require_relative 'action'
|
25
|
+
hook.before(::Vagrant::Action::Builtin::WaitForCommunicator, Vagrant::Smartos::Zones::Action.zone_start)
|
26
|
+
end
|
27
|
+
|
28
|
+
zone_stop = lambda do |hook|
|
29
|
+
require_relative 'action'
|
30
|
+
hook.before(::Vagrant::Action::Builtin::GracefulHalt, Vagrant::Smartos::Zones::Action.zone_stop)
|
31
|
+
end
|
32
|
+
|
33
|
+
action_hook('smartos-zones-up', :machine_action_up, &manage_zones)
|
34
|
+
action_hook('smartos-zones-reload', :machine_action_reload, &manage_zones)
|
35
|
+
action_hook('smartos-zones-provision', :machine_action_provision, &manage_zones)
|
36
|
+
action_hook('smartos-zones-halt', :machine_action_halt, &zone_stop)
|
37
|
+
action_hook('smartos-zones-resume', :machine_action_resume, &zone_start)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'vagrant/smartos/zones/models/snapshot'
|
2
|
+
require 'vagrant/smartos/zones/util/global_zone/helper'
|
3
|
+
|
4
|
+
module Vagrant
|
5
|
+
module Smartos
|
6
|
+
module Zones
|
7
|
+
module Models
|
8
|
+
class Dataset
|
9
|
+
include Util::GlobalZone::Helper
|
10
|
+
|
11
|
+
def self.create(name, zone)
|
12
|
+
Models::Snapshot.around(zone) do
|
13
|
+
zone.zlogin('\'find /var/log -type f -exec truncate --size 0 {} \;\'')
|
14
|
+
zone.zlogin('sm-prepare-image -y')
|
15
|
+
zone.stop
|
16
|
+
Models::Snapshot.around(zone) do |snapshot|
|
17
|
+
cmd = 'pfexec /usr/bin/bash -l -c "/usr/sbin/zfs send %s | /usr/bin/bzip2 > /zones/%s.zfs.bz2"'
|
18
|
+
with_gz(zone.machine, cmd % [snapshot.path, name])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
zone.start
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'vagrant/smartos/zones/errors'
|
2
|
+
require 'vagrant/smartos/zones/util/global_zone/helper'
|
3
|
+
|
4
|
+
module Vagrant
|
5
|
+
module Smartos
|
6
|
+
module Zones
|
7
|
+
module Models
|
8
|
+
class Snapshot
|
9
|
+
include Util::GlobalZone::Helper
|
10
|
+
|
11
|
+
attr_accessor :machine, :zone, :name, :created_at, :space_used
|
12
|
+
|
13
|
+
def self.around(zone, &block)
|
14
|
+
snapshot_name = "before_#{Time.now.to_i}"
|
15
|
+
snapshot = create(snapshot_name, zone)
|
16
|
+
if block.arity.eql?(1)
|
17
|
+
block.call snapshot
|
18
|
+
else
|
19
|
+
block.call
|
20
|
+
end
|
21
|
+
snapshot.rollback
|
22
|
+
snapshot.destroy
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.all(zone)
|
26
|
+
snapshots = []
|
27
|
+
cmd = "pfexec zfs list -t snapshot -H -r -o name,creation,used zones/#{zone.uuid}"
|
28
|
+
with_gz(zone.machine, cmd) do |output|
|
29
|
+
break if output.include?('no datasets available')
|
30
|
+
snapshots += output.split("\n").map { |l| from_line(l, zone) }
|
31
|
+
end
|
32
|
+
snapshots
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.create(name, zone)
|
36
|
+
cmd = "pfexec zfs snapshot zones/#{zone.uuid}@#{name}"
|
37
|
+
with_gz(zone.machine, cmd)
|
38
|
+
find(name, zone)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.find(name, zone)
|
42
|
+
all(zone).find { |snapshot| snapshot.name == name } || raise(SnapshotNotFound)
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.from_line(l, zone)
|
46
|
+
name, created_at, used = l.split("\t")
|
47
|
+
new.tap do |s|
|
48
|
+
s.machine = zone.machine
|
49
|
+
s.zone = zone
|
50
|
+
s.name = name.split('@').last
|
51
|
+
s.created_at = created_at
|
52
|
+
s.space_used = used
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def path
|
57
|
+
"zones/#{zone.uuid}@#{name}"
|
58
|
+
end
|
59
|
+
|
60
|
+
def destroy
|
61
|
+
with_gz("pfexec zfs destroy #{path}")
|
62
|
+
end
|
63
|
+
|
64
|
+
def rollback
|
65
|
+
with_gz("pfexec zfs rollback -r #{path}")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'vagrant/smartos/zones/errors'
|
2
|
+
require 'vagrant/smartos/zones/util/global_zone/helper'
|
3
|
+
|
4
|
+
module Vagrant
|
5
|
+
module Smartos
|
6
|
+
module Zones
|
7
|
+
module Models
|
8
|
+
class Zone
|
9
|
+
include Util::GlobalZone::Helper
|
10
|
+
|
11
|
+
attr_accessor :machine, :name, :state, :uuid, :brand, :image
|
12
|
+
|
13
|
+
def self.all(machine)
|
14
|
+
zones = []
|
15
|
+
with_gz(machine, 'pfexec vmadm lookup -j') do |output|
|
16
|
+
hashes = JSON.parse(output)
|
17
|
+
zones += hashes.map { |h| from_hash(h, machine) }
|
18
|
+
end
|
19
|
+
zones
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.find(machine, name)
|
23
|
+
zone_hash = {}
|
24
|
+
finder = "pfexec vmadm lookup -j -o uuid,alias,state,image_uuid,brand alias=#{name}"
|
25
|
+
with_gz(machine, finder) do |output|
|
26
|
+
hash = JSON.parse(output).first
|
27
|
+
raise ZoneNotFound unless hash
|
28
|
+
zone_hash.merge!(hash)
|
29
|
+
end
|
30
|
+
from_hash(zone_hash, machine)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.from_hash(zone, machine = nil)
|
34
|
+
new.tap do |z|
|
35
|
+
z.machine = machine
|
36
|
+
z.name = zone['alias']
|
37
|
+
z.uuid = zone['uuid']
|
38
|
+
z.brand = zone['brand']
|
39
|
+
z.state = zone['state']
|
40
|
+
z.image = zone['image_uuid']
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def running?
|
45
|
+
state == 'running'
|
46
|
+
end
|
47
|
+
|
48
|
+
def lx_brand?
|
49
|
+
brand == 'lx'
|
50
|
+
end
|
51
|
+
|
52
|
+
def test(cmd)
|
53
|
+
command = "pfexec zlogin #{uuid} #{cmd}"
|
54
|
+
machine.communicate.gz_test(command)
|
55
|
+
end
|
56
|
+
|
57
|
+
def zlogin(cmd, options = {})
|
58
|
+
command = "pfexec zlogin #{uuid} #{cmd}"
|
59
|
+
with_gz(command, options) do |output|
|
60
|
+
yield output if block_given?
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def destroy
|
65
|
+
with_gz("pfexec vmadm delete #{uuid}")
|
66
|
+
self.state = 'deleted'
|
67
|
+
end
|
68
|
+
|
69
|
+
def start
|
70
|
+
with_gz("pfexec vmadm start #{uuid}")
|
71
|
+
end
|
72
|
+
|
73
|
+
def stop
|
74
|
+
with_gz("pfexec vmadm stop #{uuid}")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
|
3
|
+
module Vagrant
|
4
|
+
module Smartos
|
5
|
+
module Zones
|
6
|
+
class Plugin < Vagrant.plugin('2')
|
7
|
+
name 'smartos-zones'
|
8
|
+
|
9
|
+
description 'SmartOS zone support'
|
10
|
+
|
11
|
+
communicator('smartos') do
|
12
|
+
require_relative 'communicator/smartos'
|
13
|
+
Communicator::Smartos
|
14
|
+
end
|
15
|
+
|
16
|
+
config 'global_zone' do
|
17
|
+
load_il8n
|
18
|
+
require_relative 'config/global_zone'
|
19
|
+
Config::GlobalZone
|
20
|
+
end
|
21
|
+
|
22
|
+
config 'zone' do
|
23
|
+
require_relative 'config/zone'
|
24
|
+
Config::Zone
|
25
|
+
end
|
26
|
+
|
27
|
+
command 'dataset' do
|
28
|
+
require_relative 'commands/dataset'
|
29
|
+
Command::Dataset
|
30
|
+
end
|
31
|
+
|
32
|
+
command 'global-zone' do
|
33
|
+
require_relative 'commands/global_zone'
|
34
|
+
Command::GlobalZone
|
35
|
+
end
|
36
|
+
|
37
|
+
command 'smartos' do
|
38
|
+
require_relative 'commands/smartos'
|
39
|
+
Command::Smartos
|
40
|
+
end
|
41
|
+
|
42
|
+
command 'zones' do
|
43
|
+
require_relative 'commands/zones'
|
44
|
+
Command::Zones
|
45
|
+
end
|
46
|
+
|
47
|
+
command 'zlogin' do
|
48
|
+
require_relative 'commands/zlogin'
|
49
|
+
Command::Zlogin
|
50
|
+
end
|
51
|
+
|
52
|
+
guest 'global_zone', 'smartos' do
|
53
|
+
require_relative 'guest'
|
54
|
+
Guest
|
55
|
+
end
|
56
|
+
|
57
|
+
guest_capability 'global_zone', 'create_gz_vnic' do
|
58
|
+
require_relative 'cap/create_gz_vnic'
|
59
|
+
Cap::CreateGZVnic
|
60
|
+
end
|
61
|
+
|
62
|
+
guest_capability 'global_zone', 'imgadm_import' do
|
63
|
+
require_relative 'cap/imgadm_import'
|
64
|
+
Cap::ImgadmImport
|
65
|
+
end
|
66
|
+
|
67
|
+
guest_capability 'global_zone', 'zone_gate_enable' do
|
68
|
+
require_relative 'cap/zone_gate/enable'
|
69
|
+
Cap::ZoneGate::Enable
|
70
|
+
end
|
71
|
+
|
72
|
+
guest_capability 'global_zone', 'zone_gate_install' do
|
73
|
+
require_relative 'cap/zone_gate/install'
|
74
|
+
Cap::ZoneGate::Install
|
75
|
+
end
|
76
|
+
|
77
|
+
guest_capability 'global_zone', 'zone__create' do
|
78
|
+
require_relative 'cap/zone/create'
|
79
|
+
Cap::Zone::Create
|
80
|
+
end
|
81
|
+
|
82
|
+
guest_capability 'global_zone', 'zone__start' do
|
83
|
+
require_relative 'cap/zone/start'
|
84
|
+
Cap::Zone::Start
|
85
|
+
end
|
86
|
+
|
87
|
+
guest_capability 'global_zone', 'zone__stop' do
|
88
|
+
require_relative 'cap/zone/stop'
|
89
|
+
Cap::Zone::Stop
|
90
|
+
end
|
91
|
+
|
92
|
+
host_capability 'bsd', 'platform_image_install' do
|
93
|
+
require_relative 'cap/platform_image/install'
|
94
|
+
Cap::PlatformImage::Install
|
95
|
+
end
|
96
|
+
|
97
|
+
host_capability 'bsd', 'platform_image_latest' do
|
98
|
+
require_relative 'cap/platform_image/latest'
|
99
|
+
Cap::PlatformImage::Latest
|
100
|
+
end
|
101
|
+
|
102
|
+
host_capability 'bsd', 'platform_image_list' do
|
103
|
+
require_relative 'cap/platform_image/list'
|
104
|
+
Cap::PlatformImage::List
|
105
|
+
end
|
106
|
+
|
107
|
+
class << self
|
108
|
+
def load_il8n
|
109
|
+
I18n.load_path << File.expand_path('../../locales/en.yml', __FILE__)
|
110
|
+
I18n.reload!
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
require_relative 'hooks'
|