vagrant-smartos-zones 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1df692477b2ec1b9b16af72471943afc89c47e56
4
- data.tar.gz: 896cd4b6f1731874af686af0c7e197bf593dfd27
3
+ metadata.gz: b23f15194df8189c39b2ed6a4d757e9948497185
4
+ data.tar.gz: 0fb7e83e3bb27d84cf743ce303ef2a9401f864e6
5
5
  SHA512:
6
- metadata.gz: 6e9ff7c4b39346cd7daf63b95e14a6a1041c8f3c12235cf86f73ac560d038bd5e5e99a3b9be6b91d187691a817ef7b6220ae8cce21864690eb7f430c76645106
7
- data.tar.gz: 3fd14dd777071cc407a25801367fd5f4ecfc35365f20a7ed0d3ad4ec621024580707b1106687e1b18bb6650f26f0bc57f3ec69072a69b730f760e84db0ccbfa5
6
+ metadata.gz: 19c63f89d059f8aca3098414f774e86e3eb83d1fc7986cf63e22b6e11117817696a6138e3091a09dd6b27c95b78e69f17f394bafe2293b80139b711e1d302ed9
7
+ data.tar.gz: 54489755d0f804f002127bfeccf1b971b13c9d993746b8d348b87d3ba5630a43eaa71215e852498685e5b784d899f615958b00bdfba72a24fba7f07372d8466d
data/README.md CHANGED
@@ -114,6 +114,14 @@ vagrant zones start [name]
114
114
  vagrant zones stop [name]
115
115
  ```
116
116
 
117
+ Export a running zone as a dataset (image) in the local file system:
118
+
119
+ ```bash
120
+ vagrant dataset create [zone] [identifier]
121
+ vagrant dataset delete [identifier]
122
+ vagrant dataset list
123
+ ```
124
+
117
125
  ## Single zone usage
118
126
 
119
127
  When a single zone is configured (currently the only configuration
@@ -232,19 +240,6 @@ group with which to connect. This user should have `Primary
232
240
  Administrator` privileges. When creating a local zone, a `vagrant`
233
241
  user and group are also created in the zone.
234
242
 
235
- ## Tests
236
-
237
- There is a basic test suite that uses `test-kitchen` to converge
238
- different brands of zones. Although it might not be comprehensive, it
239
- should be ran after new features or after any significant refactoring to
240
- ensure that nothing breaks the ability to stand up a zone.
241
-
242
- ```bash
243
- bundle exec kitchen test
244
- ```
245
-
246
- This may take a while...
247
-
248
243
  ## Plugin configuration
249
244
 
250
245
  The plugin allows for local configuration through the `vagrant zones
@@ -264,6 +259,9 @@ networks. For this reason, the network chosen by the plugin when
264
259
  configuring the Global Zone and its local zone can be globally
265
260
  overridden.
266
261
 
262
+ Since this is a facet of your current location and not of the box
263
+ itself, this is configured in the plugin rather than in the Vagrantfile.
264
+
267
265
  ```bash
268
266
  vagrant zones config network 10.0.0.0/24
269
267
  ```
@@ -274,6 +272,33 @@ create zones. It should be pretty obvious when this is the case.
274
272
 
275
273
  * Does your network overlap with VirtualBox's local network space?
276
274
 
275
+ ### Using local zone images
276
+
277
+ When running vagrant from a location far away from where SmartOS images
278
+ are hosted (anywhere other than the east coast of the USA, basically),
279
+ setting up a zone can be very slow.
280
+
281
+ Zones can be modified in Vagrant, then exported locally to save time on
282
+ repeated tasks. After modifying a zone, for instance by installing build
283
+ tools, you can export the zone as follows (warning: this will take a
284
+ while):
285
+
286
+ ```bash
287
+ # vagrant dataset create [zone] [identifier]
288
+ vagrant dataset create base64 base64-15.1.1-build-essential
289
+ ```
290
+
291
+ The vagrant-smartos-zones plugin can be configured to use a local zone
292
+ image in place of a remote one as follows:
293
+
294
+ ```bash
295
+ vagrant zones config dataset.0edf00aa-0562-11e5-b92f-879647d45790 base64-15.1.1-build-essential
296
+ ```
297
+
298
+ Now any Vagrantfile configured to use a local zone with the image
299
+ 0edf00aa-0562-11e5-b92f-879647d45790 will instead install and use the
300
+ local image.
301
+
277
302
  ### Pkgsrc mirror
278
303
 
279
304
  ```bash
@@ -283,6 +308,19 @@ vagrant zones config local.pkgsrc http://mirror.domain.com
283
308
  This will replace the protocol and domain of the pkgsrc mirror used by
284
309
  pkgin in a SmartOS zone.
285
310
 
311
+ ## Tests
312
+
313
+ There is a basic test suite that uses `test-kitchen` to converge
314
+ different brands of zones. Although it might not be comprehensive, it
315
+ should be ran after new features or after any significant refactoring to
316
+ ensure that nothing breaks the ability to stand up a zone.
317
+
318
+ ```bash
319
+ bundle exec kitchen test
320
+ ```
321
+
322
+ This may take a while...
323
+
286
324
  ## References / Alternatives
287
325
 
288
326
  Any success of this project depends heavily on the work of others,
@@ -13,12 +13,11 @@ Vagrant.configure('2') do |config|
13
13
 
14
14
  config.ssh.insert_key = false
15
15
 
16
- config.global_zone.platform_image = 'hourly-20141121'
17
- config.global_zone.platform_image_url = 'https://us-east.manta.joyent.com/nahamu/public/smartos/platform-hourly.iso'
16
+ config.global_zone.platform_image = 'latest'
18
17
 
19
- config.zone.name = 'lx'
18
+ config.zone.name = 'lx-ubuntu-14.04_20150415' # images are available through https://images.joyent.com/images
20
19
  config.zone.brand = 'lx'
21
- config.zone.image = 'b7493690-f019-4612-958b-bab5f844283e'
20
+ config.zone.image = '430da066-e3a7-11e4-9657-332a2dbdf565'
22
21
  config.zone.memory = 1536
23
22
  config.zone.disk_size = 5
24
23
  end
@@ -3,6 +3,17 @@ en:
3
3
  smartos:
4
4
  zones:
5
5
  commands:
6
+ dataset:
7
+ create: |-
8
+ Creating a new dataset %{dataset} from zone: %{uuid}
9
+ prepare_image: |-
10
+ Preparing zone for dataset
11
+ save: |-
12
+ Saving zone file system
13
+ start_zone: |-
14
+ Restarting zone
15
+ stop_zone: |-
16
+ Stopping zone
6
17
  zones:
7
18
  list: |-
8
19
  name state uuid
@@ -0,0 +1,17 @@
1
+ require 'vagrant/smartos/zones/util/datasets'
2
+
3
+ module Vagrant
4
+ module Smartos
5
+ module Zones
6
+ module Cap
7
+ module Dataset
8
+ class List
9
+ def self.dataset_list(env)
10
+ Zones::Util::Datasets.new(env).list
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,4 +1,7 @@
1
1
  require 'vagrant/smartos/zones/cap/base'
2
+ require 'vagrant/smartos/zones/models/dataset'
3
+ require 'vagrant/smartos/zones/util/datasets/manifest'
4
+ require 'vagrant/smartos/zones/util/zone_image'
2
5
 
3
6
  module Vagrant
4
7
  module Smartos
@@ -10,18 +13,46 @@ module Vagrant
10
13
  def execute
11
14
  return ui.info 'No zone image set, skipping import' unless image
12
15
 
13
- installed = machine.communicate.gz_test("#{sudo} imgadm get #{image}")
16
+ if zone_image.install_override?
17
+ install
18
+ else
19
+ import
20
+ end
21
+ end
14
22
 
15
- ui.info "Checking for zone image #{image}: #{installed ? 'installed' : 'not installed'}"
16
- return if installed
23
+ private
17
24
 
18
- ui.info ' Importing...'
25
+ def image
26
+ machine.config.zone.image
27
+ end
28
+
29
+ def import
30
+ ui.info "Zone image #{image}: installed" && return if installed?(image)
31
+ ui.info " Importing zone image #{image}..."
19
32
  machine.communicate.gz_execute("#{sudo} imgadm sources -a https://updates.joyent.com")
20
33
  machine.communicate.gz_execute("#{sudo} imgadm import #{image}")
21
34
  end
22
35
 
23
- def image
24
- machine.config.zone.image
36
+ def installed?(uuid)
37
+ machine.communicate.gz_test("#{sudo} imgadm get #{uuid}")
38
+ end
39
+
40
+ def install
41
+ uuid = zone_image.override_uuid
42
+ ui.info "Swapping out image #{uuid} for #{image}"
43
+ ui.info "Zone image #{uuid}: installed" && return if installed?(uuid)
44
+ dataset = Models::Dataset.install(zone_image.override, machine)
45
+ machine.communicate.gz_upload(manifest.local_filename, manifest.remote_filename)
46
+ ui.info " Unpacking #{uuid}..."
47
+ machine.communicate.gz_execute("#{sudo} imgadm install -m #{manifest.remote_filename} -f #{dataset.remote_filename}")
48
+ end
49
+
50
+ def manifest
51
+ @manifest ||= Util::Datasets::Manifest.new(zone_image.override, machine.env).load!
52
+ end
53
+
54
+ def zone_image
55
+ @zone_image ||= Util::ZoneImage.new(machine)
25
56
  end
26
57
  end
27
58
  end
@@ -40,7 +40,8 @@ module Vagrant
40
40
 
41
41
  def create(zonename, dataset)
42
42
  with_zone(zonename) do |zone|
43
- Models::Dataset.create(dataset, zone)
43
+ ui.info(I18n.t('vagrant.smartos.zones.commands.dataset.create', uuid: zone.uuid, dataset: dataset))
44
+ Models::Dataset.create(dataset, zone, zone.machine)
44
45
  end
45
46
  end
46
47
 
@@ -1,4 +1,5 @@
1
1
  require 'vagrant/smartos/zones/util/global_zone/connection'
2
+ require 'vagrant/smartos/zones/util/rsync'
2
3
 
3
4
  module Vagrant
4
5
  module Smartos
@@ -10,6 +11,38 @@ module Vagrant
10
11
  super
11
12
  end
12
13
 
14
+ def gz_download(from, to = nil)
15
+ @logger.debug("Downloading from global zone: #{from} to #{to}")
16
+
17
+ if gz_rsync_connector.available?
18
+ gz_rsync_connector.download(from, to)
19
+ else
20
+ gz_scp_connect do |scp|
21
+ scp.download!(from, to) do |_ch, name, sent, total|
22
+ percent = (sent.to_f / total) * 100
23
+ print "#{name}: #{sent}/#{total} : #{percent.to_i}%\r"
24
+ $stdout.flush
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ def gz_upload(from, to)
31
+ @logger.debug("Uploading to global zone: #{from} to #{to}")
32
+
33
+ if gz_rsync_connector.available?
34
+ gz_rsync_connector.upload(from, to)
35
+ else
36
+ gz_scp_connect do |scp|
37
+ scp.upload!(from, to) do |_ch, name, sent, total|
38
+ percent = (sent.to_f / total) * 100
39
+ print "#{name}: #{sent}/#{total} : #{percent.to_i}%\r"
40
+ $stdout.flush
41
+ end
42
+ end
43
+ end
44
+ end
45
+
13
46
  # rubocop:disable Metrics/MethodLength
14
47
  def gz_execute(command, opts = {}, &block)
15
48
  opts = {
@@ -70,6 +103,15 @@ module Vagrant
70
103
  exit_status
71
104
  end
72
105
 
106
+ def gz_scp_connect
107
+ global_zone_connector.with_connection do |connection|
108
+ yield connection.scp
109
+ end
110
+ rescue Net::SCP::Error => e
111
+ raise Vagrant::Errors::SCPUnavailable if e.message =~ /\(127\)/
112
+ raise
113
+ end
114
+
73
115
  def gz_test(command, opts = nil)
74
116
  opts = { error_check: false }.merge(opts || {})
75
117
  gz_execute(command, opts) == 0
@@ -80,6 +122,10 @@ module Vagrant
80
122
  def global_zone_connector
81
123
  @global_zone_connector ||= Vagrant::Smartos::Zones::Util::GlobalZone::Connection.new(@machine, @logger)
82
124
  end
125
+
126
+ def gz_rsync_connector
127
+ @gz_rsync_connector ||= Vagrant::Smartos::Zones::Util::Rsync.new(global_zone_connector.connect)
128
+ end
83
129
  end
84
130
  end
85
131
  end
@@ -1,4 +1,6 @@
1
1
  require 'vagrant/smartos/zones/models/snapshot'
2
+ require 'vagrant/smartos/zones/util/datasets'
3
+ require 'vagrant/smartos/zones/util/datasets/manifest'
2
4
  require 'vagrant/smartos/zones/util/global_zone/helper'
3
5
 
4
6
  module Vagrant
@@ -8,18 +10,94 @@ module Vagrant
8
10
  class Dataset
9
11
  include Util::GlobalZone::Helper
10
12
 
13
+ attr_reader :name, :zone, :machine
14
+
15
+ def initialize(name, zone, machine)
16
+ @name = name
17
+ @zone = zone
18
+ @machine = machine
19
+ end
20
+
11
21
  def self.create(name, zone)
22
+ new(name, zone).create
23
+ end
24
+
25
+ def self.install(name, machine)
26
+ new(name, nil, machine).install
27
+ end
28
+
29
+ def create
30
+ Zones::Util::Datasets.new(machine.env).setup_smartos_directories
31
+ prepare_gz
32
+ # create_dataset
33
+ # download
34
+ write_manifest
35
+ end
36
+
37
+ def exists?
38
+ cmd = 'ls %s 2>/dev/null' % remote_filename
39
+ with_gz(cmd) do |output|
40
+ return true if output.strip == remote_filename
41
+ end
42
+ false
43
+ end
44
+
45
+ def install
46
+ prepare_gz
47
+ upload
48
+ self
49
+ end
50
+
51
+ def remote_filename
52
+ '/zones/vagrant/%s' % filename
53
+ end
54
+
55
+ private
56
+
57
+ def prepare_gz
58
+ with_gz('pfexec mkdir /zones/vagrant')
59
+ with_gz('pfexec chown vagrant:vagrant /zones/vagrant')
60
+ end
61
+
62
+ def create_dataset
63
+ return machine.ui.info('Dataset already exists in global zone') if exists?
12
64
  Models::Snapshot.around(zone) do
65
+ machine.ui.info(I18n.t('vagrant.smartos.zones.commands.dataset.prepare_image'))
13
66
  zone.zlogin('\'find /var/log -type f -exec truncate --size 0 {} \;\'')
14
67
  zone.zlogin('sm-prepare-image -y')
68
+ machine.ui.info(I18n.t('vagrant.smartos.zones.commands.dataset.stop_zone'))
15
69
  zone.stop
16
70
  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])
71
+ machine.ui.info(I18n.t('vagrant.smartos.zones.commands.dataset.save'))
72
+ cmd = 'pfexec /usr/bin/bash -l -c "/usr/sbin/zfs send %s | /usr/bin/bzip2 > %s"'
73
+ with_gz(cmd % [snapshot.path, remote_filename])
19
74
  end
20
75
  end
76
+ machine.ui.info(I18n.t('vagrant.smartos.zones.commands.dataset.start_zone'))
21
77
  zone.start
22
78
  end
79
+
80
+ def download
81
+ machine.ui.info 'Downloading %s' % filename
82
+ machine.communicate.gz_download(remote_filename, local_filename)
83
+ end
84
+
85
+ def upload
86
+ machine.ui.info 'Installing %s in global zone' % filename
87
+ machine.communicate.gz_upload(local_filename, remote_filename)
88
+ end
89
+
90
+ def write_manifest
91
+ Zones::Util::Datasets::Manifest.new(name, machine.env).write!
92
+ end
93
+
94
+ def filename
95
+ '%s.zfs.bz2' % name
96
+ end
97
+
98
+ def local_filename
99
+ machine.env.home_path.join('smartos', 'datasets', filename).to_s
100
+ end
23
101
  end
24
102
  end
25
103
  end
@@ -90,6 +90,11 @@ module Vagrant
90
90
  Cap::Zone::Stop
91
91
  end
92
92
 
93
+ host_capability 'bsd', 'dataset_list' do
94
+ require_relative 'cap/dataset/list'
95
+ Cap::Dataset::List
96
+ end
97
+
93
98
  host_capability 'bsd', 'platform_image_install' do
94
99
  require_relative 'cap/platform_image/install'
95
100
  Cap::PlatformImage::Install
@@ -0,0 +1,95 @@
1
+ require 'securerandom'
2
+ require 'vagrant/smartos/zones/util/datasets'
3
+
4
+ module Vagrant
5
+ module Smartos
6
+ module Zones
7
+ module Util
8
+ class Datasets
9
+ class Manifest
10
+ attr_reader :name, :env
11
+
12
+ def initialize(name, env)
13
+ @name = name
14
+ @env = env
15
+ end
16
+
17
+ def write!
18
+ File.open(local_filename, 'w') do |f|
19
+ f.write to_json
20
+ end
21
+ self
22
+ end
23
+
24
+ def load!
25
+ json = JSON.load(File.read(local_filename))
26
+ @creator = json['creator_uuid']
27
+ @uuid = json['uuid']
28
+ self
29
+ end
30
+
31
+ def to_json
32
+ {
33
+ 'creator_name' => 'vagrant-smartos-zones',
34
+ 'creator_uuid' => creator_uuid,
35
+ 'description' => name,
36
+ 'files' => files,
37
+ 'name' => name,
38
+ 'os' => 'smartos',
39
+ 'published_at' => '2015-06-15T15:13:08.425Z',
40
+ 'type' => 'zone-dataset',
41
+ 'urn' => urn,
42
+ 'uuid' => uuid,
43
+ 'version' => '1.0.0'
44
+ }.to_json
45
+ end
46
+
47
+ def local_filename
48
+ env.home_path.join('smartos', 'datasets', manifest_filename).to_s
49
+ end
50
+
51
+ def remote_filename
52
+ '/zones/vagrant/%s' % manifest_filename
53
+ end
54
+
55
+ def uuid
56
+ @uuid ||= SecureRandom.uuid
57
+ end
58
+
59
+ private
60
+
61
+ def files
62
+ [
63
+ {
64
+ 'path' => "#{name}.zfs.bz2",
65
+ 'sha1' => sha1,
66
+ 'size' => size
67
+ }
68
+ ]
69
+ end
70
+
71
+ def creator_uuid
72
+ @creator ||= SecureRandom.uuid
73
+ end
74
+
75
+ def sha1
76
+ Datasets.new(env).sha1(name)
77
+ end
78
+
79
+ def size
80
+ Datasets.new(env).size(name)
81
+ end
82
+
83
+ def urn
84
+ "smartos:vagrant-smartos-zones:#{name}:1.0.0"
85
+ end
86
+
87
+ def manifest_filename
88
+ '%s.dsmanifest' % name
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,56 @@
1
+ require 'digest/sha1'
2
+
3
+ module Vagrant
4
+ module Smartos
5
+ module Zones
6
+ module Util
7
+ class Datasets
8
+ attr_reader :env, :machine
9
+
10
+ def initialize(env, machine = nil)
11
+ @env = env
12
+ @machine = machine
13
+ end
14
+
15
+ def list
16
+ setup_smartos_directories
17
+ ui.info(datasets.join("\n"), prefix: false)
18
+ end
19
+
20
+ def setup_smartos_directories
21
+ env.setup_home_path if env.respond_to?(:setup_home_path)
22
+ FileUtils.mkdir_p(dataset_dir)
23
+ end
24
+
25
+ def sha1(name)
26
+ Digest::SHA1.file(dataset_dir.join("#{name}.zfs.bz2")).hexdigest
27
+ end
28
+
29
+ def size(name)
30
+ ::File.size(dataset_dir.join("#{name}.zfs.bz2"))
31
+ end
32
+
33
+ private
34
+
35
+ def ui
36
+ env.respond_to?(:ui) ? env.ui : env[:ui]
37
+ end
38
+
39
+ def home_path
40
+ env.respond_to?(:home_path) ? env.home_path : env[:home_path]
41
+ end
42
+
43
+ def datasets
44
+ Dir[dataset_dir.join('*.zfs.bz2')].map do |f|
45
+ File.basename(f, '.zfs.bz2')
46
+ end.sort
47
+ end
48
+
49
+ def dataset_dir
50
+ home_path.join('smartos', 'datasets')
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,51 @@
1
+ module Vagrant
2
+ module Smartos
3
+ module Zones
4
+ module Util
5
+ class Rsync
6
+ attr_reader :connection
7
+
8
+ def initialize(connection)
9
+ @connection = connection
10
+ end
11
+
12
+ def available?
13
+ Vagrant::Util::Subprocess.execute(*%w(which rsync)).exit_code == 0
14
+ end
15
+
16
+ def download(from, to)
17
+ Vagrant::Util::Subprocess.execute(*rsync_command, '-e', ssh_command, remote(from), to, notify: [:stdout])
18
+ end
19
+
20
+ def upload(from, to)
21
+ Vagrant::Util::Subprocess.execute(*rsync_command, '-e', ssh_command, from, remote(to), notify: [:stdout])
22
+ end
23
+
24
+ def rsync_command
25
+ %w(rsync -avz --progress)
26
+ end
27
+
28
+ def ssh_command
29
+ "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i #{identity_file} -p #{remote_port}"
30
+ end
31
+
32
+ def identity_file
33
+ connection.options[:keys].first
34
+ end
35
+
36
+ def remote(file)
37
+ "#{remote_user}@#{connection.host}:#{file}"
38
+ end
39
+
40
+ def remote_port
41
+ connection.options[:port]
42
+ end
43
+
44
+ def remote_user
45
+ connection.options[:user]
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -18,13 +18,18 @@ module Vagrant
18
18
  def find(group)
19
19
  Models::ZoneGroup.new.tap do |g|
20
20
  g.name = group
21
- with_gz("#{sudo} zlogin #{zone.uuid} gid -g #{group}") do |_type, output|
22
- g.gid = output.chomp
21
+ with_gz("#{sudo} zlogin #{zone.uuid} gid -g #{group}") do |output|
22
+ g.gid = output.chomp if output
23
23
  end
24
24
  end
25
25
  end
26
26
 
27
+ def exists?(group)
28
+ machine.communicate.gz_test("#{sudo} zlogin #{zone.uuid} gid -g #{group}")
29
+ end
30
+
27
31
  def create(group)
32
+ return if exists?(group)
28
33
  zone.zlogin("groupadd #{group}")
29
34
  end
30
35
  end
@@ -0,0 +1,43 @@
1
+ require 'vagrant/smartos/zones/models/config'
2
+
3
+ module Vagrant
4
+ module Smartos
5
+ module Zones
6
+ module Util
7
+ class ZoneImage
8
+ attr_reader :machine
9
+
10
+ def initialize(machine)
11
+ @machine = machine
12
+ end
13
+
14
+ def image
15
+ machine.config.zone.image
16
+ end
17
+
18
+ def install_override?
19
+ !!override
20
+ end
21
+
22
+ def override
23
+ plugin_config["dataset.#{image}"]
24
+ end
25
+
26
+ def override_uuid
27
+ @override_uuid ||= manifest.uuid
28
+ end
29
+
30
+ private
31
+
32
+ def plugin_config
33
+ @plugin_config ||= Models::Config.config(machine.env).hash
34
+ end
35
+
36
+ def manifest
37
+ @manifest ||= Util::Datasets::Manifest.new(override, machine.env).load!
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,4 +1,5 @@
1
1
  require 'vagrant/smartos/zones/models/network'
2
+ require 'vagrant/smartos/zones/util/zone_image'
2
3
 
3
4
  module Vagrant
4
5
  module Smartos
@@ -23,7 +24,7 @@ module Vagrant
23
24
  {
24
25
  'brand' => machine.config.zone.brand,
25
26
  'alias' => machine.config.zone.name,
26
- 'dataset_uuid' => machine.config.zone.image,
27
+ 'dataset_uuid' => image,
27
28
  'quota' => machine.config.zone.disk_size || 1,
28
29
  'max_physical_memory' => machine.config.zone.memory || 64
29
30
  }
@@ -67,6 +68,10 @@ module Vagrant
67
68
  }
68
69
  end
69
70
 
71
+ def image
72
+ zone_image.install_override? ? zone_image.override_uuid : machine.config.zone.image
73
+ end
74
+
70
75
  private
71
76
 
72
77
  def lx_brand?
@@ -76,6 +81,10 @@ module Vagrant
76
81
  def network
77
82
  @network ||= Models::Network.new(machine.env)
78
83
  end
84
+
85
+ def zone_image
86
+ @zone_image ||= Util::ZoneImage.new(machine)
87
+ end
79
88
  end
80
89
  end
81
90
  end
@@ -15,8 +15,13 @@ module Vagrant
15
15
  @zone = zone
16
16
  end
17
17
 
18
+ def exists?(project)
19
+ machine.communicate.gz_test("#{sudo} zlogin #{zone.uuid} projects -l #{project}")
20
+ end
21
+
18
22
  def create(project, users, comment)
19
23
  return if zone.lx_brand?
24
+ return if exists?(project)
20
25
  zone.zlogin("projadd -c \"#{comment}\" -U #{users.join(',')} #{project}")
21
26
  end
22
27
  end
@@ -19,13 +19,18 @@ module Vagrant
19
19
  def find(username)
20
20
  Models::ZoneUser.new.tap do |u|
21
21
  u.name = username
22
- machine.communicate.gz_execute("#{sudo} zlogin #{zone.uuid} id -u #{username}") do |_type, output|
23
- u.uid = output.chomp
22
+ with_gz("#{sudo} zlogin #{zone.uuid} id -u #{username}") do |output|
23
+ u.uid = output.chomp if output
24
24
  end
25
25
  end
26
26
  end
27
27
 
28
+ def exists?(username)
29
+ machine.communicate.gz_test("#{sudo} zlogin #{zone.uuid} id -u #{username}")
30
+ end
31
+
28
32
  def create(username, group, role = nil)
33
+ return if exists?(username)
29
34
  zone.zlogin("useradd #{flags(group)} #{username}")
30
35
  grant_role(username, role)
31
36
  install_public_key(group)
@@ -27,8 +27,8 @@ module Vagrant
27
27
  end
28
28
 
29
29
  def create(name)
30
- machine.ui.info "Creating zone #{machine.config.zone.name} with image #{machine.config.zone.image}"
31
- with_gz("echo '#{zone_json}' | #{sudo} vmadm create")
30
+ machine.ui.info "Creating zone #{machine.config.zone.name} with image #{zone_json.image}"
31
+ with_gz("echo '#{zone_json.to_json}' | #{sudo} vmadm create")
32
32
  with_zone(name) do |zone|
33
33
  create_zone_users(zone)
34
34
  configure_pkgsrc_mirror(zone)
@@ -38,7 +38,7 @@ module Vagrant
38
38
  def update(name)
39
39
  with_zone(name) do |zone|
40
40
  machine.ui.info "Updating zone #{name}..."
41
- with_gz("echo '#{zone_json}' | #{sudo} vmadm update #{zone.uuid}")
41
+ with_gz("echo '#{zone_json.to_json}' | #{sudo} vmadm update #{zone.uuid}")
42
42
  end
43
43
  end
44
44
 
@@ -81,7 +81,7 @@ module Vagrant
81
81
  end
82
82
 
83
83
  def zone_json
84
- Util::ZoneJson.new(machine).to_json
84
+ Util::ZoneJson.new(machine)
85
85
  end
86
86
 
87
87
  def with_zone(name)
@@ -1,7 +1,7 @@
1
1
  module Vagrant
2
2
  module Smartos
3
3
  module Zones
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-smartos-zones
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Saxby
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-14 00:00:00.000000000 Z
11
+ date: 2015-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: netaddr
@@ -107,6 +107,7 @@ files:
107
107
  - lib/vagrant/smartos/zones/action/zone_gate/install.rb
108
108
  - lib/vagrant/smartos/zones/cap/base.rb
109
109
  - lib/vagrant/smartos/zones/cap/create_gz_vnic.rb
110
+ - lib/vagrant/smartos/zones/cap/dataset/list.rb
110
111
  - lib/vagrant/smartos/zones/cap/imgadm_import.rb
111
112
  - lib/vagrant/smartos/zones/cap/platform_image/install.rb
112
113
  - lib/vagrant/smartos/zones/cap/platform_image/latest.rb
@@ -138,14 +139,18 @@ files:
138
139
  - lib/vagrant/smartos/zones/models/zone_user.rb
139
140
  - lib/vagrant/smartos/zones/plugin.rb
140
141
  - lib/vagrant/smartos/zones/util/checksum.rb
142
+ - lib/vagrant/smartos/zones/util/datasets.rb
143
+ - lib/vagrant/smartos/zones/util/datasets/manifest.rb
141
144
  - lib/vagrant/smartos/zones/util/downloader.rb
142
145
  - lib/vagrant/smartos/zones/util/global_zone/connection.rb
143
146
  - lib/vagrant/smartos/zones/util/global_zone/helper.rb
144
147
  - lib/vagrant/smartos/zones/util/global_zone/ssh_info.rb
145
148
  - lib/vagrant/smartos/zones/util/platform_images.rb
146
149
  - lib/vagrant/smartos/zones/util/public_key.rb
150
+ - lib/vagrant/smartos/zones/util/rsync.rb
147
151
  - lib/vagrant/smartos/zones/util/snapshots.rb
148
152
  - lib/vagrant/smartos/zones/util/zone_group.rb
153
+ - lib/vagrant/smartos/zones/util/zone_image.rb
149
154
  - lib/vagrant/smartos/zones/util/zone_json.rb
150
155
  - lib/vagrant/smartos/zones/util/zone_project.rb
151
156
  - lib/vagrant/smartos/zones/util/zone_user.rb
@@ -177,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
177
182
  version: '0'
178
183
  requirements: []
179
184
  rubyforge_project:
180
- rubygems_version: 2.4.4
185
+ rubygems_version: 2.2.3
181
186
  signing_key:
182
187
  specification_version: 4
183
188
  summary: Manage SmartOS zones in Vagrant
@@ -187,4 +192,3 @@ test_files:
187
192
  - test/integration/default/serverspec/user_spec.rb
188
193
  - test/templates/Vagrantfile.smartos.erb
189
194
  - test/templates/bootstrap.sh
190
- has_rdoc: