vagrant-smartos 0.0.1alpha

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in vagrant-smartos.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ ## Cargo-culted from vagrant-aws ##
8
+ # We depend on Vagrant for development, but we don't add it as a
9
+ # gem dependency because we expect to be installed within the
10
+ # Vagrant environment itself using `vagrant plugin`.
11
+ gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git"
12
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Thomas Haggett
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Vagrant::Smartos
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'vagrant-smartos'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install vagrant-smartos
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/Vagrantfile ADDED
@@ -0,0 +1,46 @@
1
+ Vagrant.require_plugin "vagrant-smartos"
2
+
3
+ Vagrant.configure("2") do |config|
4
+ config.vm.box = "smartos-dummy"
5
+
6
+
7
+ config.vm.provision :shell, :inline => "pkgin -y install ruby193-base"
8
+
9
+ config.vm.provider :smartos do |smartos, override|
10
+
11
+ smartos.hypervisor = "root@172.16.251.129"
12
+ smartos.image_uuid = "cf7e2f40-9276-11e2-af9a-0bad2233fb0b"
13
+
14
+ smartos.ip_address = "172.16.251.18"
15
+ smartos.subnet_mask = "255.255.255.0"
16
+ smartos.gateway = "172.16.251.2"
17
+ end
18
+
19
+ config.vm.synced_folder "locales/", "/vagrant"
20
+
21
+
22
+ config.vm.define :test1 do |test|
23
+ test.vm.provider :smartos do |smartos, override|
24
+ smartos.ip_address = "172.16.251.21"
25
+ end
26
+ end
27
+
28
+ config.vm.define :test2 do |test|
29
+ test.vm.provider :smartos do |smartos, override|
30
+ smartos.ip_address = "172.16.251.22"
31
+ end
32
+ end
33
+
34
+ config.vm.define :test3 do |test|
35
+ test.vm.provider :smartos do |smartos, override|
36
+ smartos.ip_address = "172.16.251.23"
37
+ end
38
+ end
39
+
40
+ config.vm.define :test4 do |test|
41
+ test.vm.provider :smartos do |smartos, override|
42
+ smartos.ip_address = "172.16.251.24"
43
+ end
44
+ end
45
+
46
+ end
File without changes
@@ -0,0 +1,3 @@
1
+ {
2
+ "provider": "smartos"
3
+ }
Binary file
@@ -0,0 +1,77 @@
1
+ require 'net/ssh'
2
+
3
+ module VagrantPlugins
4
+
5
+ module Smartos
6
+ class Provider
7
+
8
+
9
+ class SshWrapper
10
+ def initialize(net_ssh)
11
+ @ssh = net_ssh
12
+ end
13
+
14
+ UnexpectedExitCode = Class.new(RuntimeError)
15
+ CommandExecutionFailed = Class.new(RuntimeError)
16
+
17
+ # Public: Execute and block on a command on the remote SSH server
18
+ #
19
+ # Returns the stdout data, stderr is piped out to screen
20
+ #
21
+ # Raises SshWrapper::UnexpectedExitCode if the exitcode is non-0
22
+ # Raises SshWrapper::CommandExecutionFailed if the command failed to execute
23
+ def exec(command)
24
+ stdout_data = []
25
+ channel = @ssh.open_channel do |ch|
26
+ ch.exec command do |ch, success|
27
+ raise SshWrapper::CommandExecutionFailed unless success
28
+
29
+ # "on_data" is called when the process writes something to stdout
30
+ ch.on_data do |c, data|
31
+ stdout_data << data
32
+ end
33
+
34
+ # "on_extended_data" is called when the process writes something to stderr
35
+ ch.on_extended_data do |c, type, data|
36
+ $stderr.print data
37
+ end
38
+
39
+ channel.on_request("exit-status") do |ch,data|
40
+ raise SshWrapper::UnexpectedExitCode unless data.read_long == 0
41
+ end
42
+ end
43
+ end
44
+
45
+ channel.wait
46
+
47
+ stdout_data.join("")
48
+ end
49
+ end
50
+
51
+
52
+ class ConnectHypervisor
53
+
54
+ def initialize(app, env)
55
+ @app = app
56
+ @logger = Log4r::Logger.new("vagrant_smartos::action::connect_hypervisor")
57
+ end
58
+
59
+ def call(env)
60
+
61
+ username,hostname = env[:machine].provider_config.hypervisor.split("@")
62
+
63
+ Net::SSH.start(hostname,username) do |ssh|
64
+
65
+ env[:hyp_ssh] = ssh
66
+ env[:hyp] = SshWrapper.new(ssh)
67
+ @app.call(env)
68
+
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,24 @@
1
+ module VagrantPlugins
2
+
3
+ module Smartos
4
+ class Provider
5
+
6
+ class IsCreated
7
+
8
+ def initialize(app, env)
9
+ @app = app
10
+ @logger = Log4r::Logger.new("vagrant_smartos::action::is_created")
11
+ end
12
+
13
+ def call(env)
14
+
15
+ env[:result] = env[:machine].state.id != :not_created
16
+
17
+ @app.call(env)
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module Smartos
3
+ class Provider
4
+ class MessageAlreadyCreated
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info(I18n.t("vagrant_smartos.already_created"))
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module Smartos
3
+ class Provider
4
+ class MessageNotCreated
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info(I18n.t("vagrant_smartos.not_created"))
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,46 @@
1
+ require "log4r"
2
+
3
+ module VagrantPlugins
4
+ module Smartos
5
+ class Provider
6
+ # This action reads the state of the machine and puts it in the
7
+ # `:machine_state_id` key in the environment.
8
+ class ReadState
9
+ def initialize(app, env)
10
+ @app = app
11
+ @logger = Log4r::Logger.new("vagrant_smartos::action::read_state")
12
+ end
13
+
14
+ def call(env)
15
+ output = env[:machine].id && read_state(env[:hyp], env[:machine])
16
+
17
+ if output
18
+ env[:machine_state_id] = output["state"].to_sym
19
+ env[:machine_ssh_info] = {
20
+ :host => output["nics"].first["ip"],
21
+ :port => 22
22
+ }
23
+ else
24
+ env[:machine_state_id] = :not_created
25
+ end
26
+
27
+ @app.call(env)
28
+ end
29
+
30
+ def read_state(hyp, machine)
31
+ begin
32
+ output = hyp.exec("vmadm get #{machine.id}")
33
+ rescue SshWrapper::UnexpectedExitCode
34
+ return :not_created
35
+ end
36
+
37
+ if output.chomp == ""
38
+ nil
39
+ else
40
+ JSON.load(output)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,102 @@
1
+ require 'uuid'
2
+ require "log4r"
3
+ require 'vagrant/util/retryable'
4
+
5
+ module VagrantPlugins
6
+ module Smartos
7
+ class Provider
8
+
9
+ class RunInstance
10
+ include Vagrant::Util::Retryable
11
+
12
+ def initialize(app, env)
13
+ @app = app
14
+ @logger = Log4r::Logger.new("vagrant_smartos::action::run_instance")
15
+ end
16
+
17
+ def call(env)
18
+
19
+ image_uuid =
20
+
21
+ vlan = "" #104
22
+ nic_tag = "admin"
23
+ ip_address = "172.16.251.120"
24
+ subnet_mask = "255.255.255.0"
25
+ gateway = "172.16.251.2"
26
+
27
+ nic = {
28
+ "nic_tag" => env[:machine].provider_config.nic_tag,
29
+ "ip" => env[:machine].provider_config.ip_address,
30
+ "netmask" => env[:machine].provider_config.subnet_mask,
31
+ "gateway" => env[:machine].provider_config.gateway,
32
+ "primary" => true
33
+ }
34
+
35
+ if env[:machine].provider_config.vlan
36
+ nic["vlan_id"] = env[:machine].provider_config.vlan
37
+ end
38
+
39
+ env[:machine].id = UUID.generate
40
+
41
+ machine_json = {
42
+ "uuid" => env[:machine].id,
43
+ "brand" => "joyent",
44
+ "image_uuid" => env[:machine].provider_config.image_uuid,
45
+ "alias" => "vagrant-#{Time.now.to_i}",
46
+ "max_physical_memory" => env[:machine].provider_config.ram,
47
+ "quota" => env[:machine].provider_config.quota,
48
+ "nics" => [nic],
49
+ "customer_metadata" => {
50
+ "user-script" => "useradd -s /usr/bin/bash -m vagrant && passwd -N vagrant && mkdir -p ~vagrant/.ssh && echo 'vagrant ALL=NOPASSWD: ALL' >> /opt/local/etc/sudoers && echo 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key' >> ~vagrant/.ssh/authorized_keys"
51
+ }
52
+ }
53
+
54
+
55
+ # Launch!
56
+ env[:ui].info(I18n.t("vagrant_smartos.launching_instance"))
57
+
58
+ env[:hyp].exec("vmadm create <<JSON\n#{JSON.dump(machine_json)}\nJSON")
59
+
60
+ env[:ui].info(I18n.t("vagrant_smartos.waiting_for_ready"))
61
+ while true
62
+ break if env[:interrupted]
63
+ break if env[:machine].provider.state.id == :running
64
+ sleep 2
65
+ end
66
+
67
+ env[:ui].info(I18n.t("vagrant_smartos.waiting_for_ssh"))
68
+ while true
69
+ break if env[:interrupted]
70
+ break if env[:machine].communicate.ready?
71
+ sleep 2
72
+ end
73
+
74
+ if env[:interrupted]
75
+ terminate(env)
76
+ else
77
+ env[:ui].info(I18n.t("vagrant_smartos.ready"))
78
+ end
79
+
80
+ @app.call(env)
81
+ end
82
+
83
+ def recover(env)
84
+ return if env["vagrant.error"].is_a?(Vagrant::Errors::VagrantError)
85
+
86
+ if env[:machine].provider.state.id != :not_created
87
+ # Undo the import
88
+ terminate(env)
89
+ end
90
+ end
91
+
92
+ def terminate(env)
93
+ destroy_env = env.dup
94
+ destroy_env.delete(:interrupted)
95
+ destroy_env[:config_validate] = false
96
+ destroy_env[:force_confirm_destroy] = true
97
+ env[:action_runner].run(env[:machine].provider.action_destroy, destroy_env)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,67 @@
1
+ require "log4r"
2
+
3
+ require "vagrant/util/subprocess"
4
+
5
+ require "vagrant/util/scoped_hash_override"
6
+
7
+ module VagrantPlugins
8
+ module Smartos
9
+ class Provider
10
+ # This middleware uses `rsync` to sync the folders over to the
11
+ # AWS instance.
12
+ class SyncFolders
13
+ include Vagrant::Util::ScopedHashOverride
14
+
15
+ def initialize(app, env)
16
+ @app = app
17
+ @logger = Log4r::Logger.new("vagrant_smartos::action::sync_folders")
18
+ end
19
+
20
+ def call(env)
21
+ @app.call(env)
22
+
23
+ ssh_info = env[:machine].ssh_info
24
+
25
+ env[:machine].config.vm.synced_folders.each do |id, data|
26
+ data = scoped_hash_override(data, :smartos)
27
+
28
+ # Ignore disabled shared folders
29
+ next if data[:disabled]
30
+
31
+ hostpath = File.expand_path(data[:hostpath], env[:root_path])
32
+ guestpath = data[:guestpath]
33
+
34
+ # Make sure there is a trailing slash on the host path to
35
+ # avoid creating an additional directory with rsync
36
+ hostpath = "#{hostpath}/" if hostpath !~ /\/$/
37
+
38
+ env[:ui].info(I18n.t("vagrant_smartos.rsync_folder",
39
+ :hostpath => hostpath,
40
+ :guestpath => guestpath))
41
+
42
+ # Create the guest path
43
+ env[:machine].communicate.sudo("mkdir -p '#{guestpath}'")
44
+ env[:machine].communicate.sudo(
45
+ "chown #{ssh_info[:username]} '#{guestpath}'")
46
+
47
+ # Rsync over to the guest path using the SSH info
48
+ command = [
49
+ "rsync", "--verbose", "--archive", "-z",
50
+ "--exclude", ".vagrant/",
51
+ "-e", "ssh -p #{ssh_info[:port]} -o StrictHostKeyChecking=no -i '#{ssh_info[:private_key_path]}'",
52
+ hostpath,
53
+ "#{ssh_info[:username]}@#{ssh_info[:host]}:#{guestpath}"]
54
+
55
+ r = Vagrant::Util::Subprocess.execute(*command)
56
+ if r.exit_code != 0
57
+ raise Errors::RsyncError,
58
+ :guestpath => guestpath,
59
+ :hostpath => hostpath,
60
+ :stderr => r.stderr
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,29 @@
1
+ require 'uuid'
2
+ require "log4r"
3
+ require 'vagrant/util/retryable'
4
+
5
+ module VagrantPlugins
6
+ module Smartos
7
+ class Provider
8
+ # This runs the configured instance.
9
+ class TerminateInstance
10
+ include Vagrant::Util::Retryable
11
+
12
+ def initialize(app, env)
13
+ @app = app
14
+ @logger = Log4r::Logger.new("vagrant_smartos::action::terminate_instance")
15
+ end
16
+
17
+ def call(env)
18
+ vm_uuid = env[:machine].id
19
+
20
+ if env[:machine].state.id != :not_created
21
+ env[:ui].info(I18n.t("vagrant_smartos.terminating"))
22
+ env[:hyp].exec("vmadm destroy #{vm_uuid}")
23
+ env[:machine].id = nil
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,58 @@
1
+ module VagrantPlugins
2
+ module Smartos
3
+ class Config < Vagrant.plugin("2", :config)
4
+ # The hypervisor to run VMs on
5
+ #
6
+ # @return [String] (username@ipaddress)
7
+ attr_accessor :hypervisor
8
+
9
+ # The UUID of the image to use
10
+ #
11
+ # @return [String] UUID
12
+ attr_accessor :image_uuid
13
+
14
+ attr_accessor :nic_tag, :ip_address, :subnet_mask, :gateway, :vlan, :ram, :quota
15
+
16
+ def initialize
17
+ @hypervisor = UNSET_VALUE
18
+ @image_uuid = UNSET_VALUE
19
+ @nic_tag = UNSET_VALUE
20
+ @ip_address = UNSET_VALUE
21
+ @subnet_mask = UNSET_VALUE
22
+ @gateway = UNSET_VALUE
23
+ @vlan = UNSET_VALUE
24
+ @ram = UNSET_VALUE
25
+ @quota = UNSET_VALUE
26
+ @__finalized = false
27
+ end
28
+
29
+ def finalize!
30
+ @hypervisor = nil if @hypervisor == UNSET_VALUE
31
+ @image_uuid = nil if @image_uuid == UNSET_VALUE
32
+ @nic_tag = "admin" if @nic_tag == UNSET_VALUE
33
+ @ip_address = nil if @ip_address == UNSET_VALUE
34
+ @subnet_mask = nil if @subnet_mask == UNSET_VALUE
35
+ @gateway = nil if @gateway == UNSET_VALUE
36
+ @vlan = nil if @vlan == UNSET_VALUE
37
+ @ram = 256 if @ram == UNSET_VALUE
38
+ @quota = 5 if @quota == UNSET_VALUE
39
+
40
+ # Mark that we finalized
41
+ @__finalized = true
42
+ end
43
+
44
+ def validate(machine)
45
+ errors = []
46
+
47
+ errors << I18n.t("vagrant_smartos.config.hypervisor_required") if @hypervisor.nil?
48
+ errors << I18n.t("vagrant_smartos.config.image_uuid_required") if @image_uuid.nil?
49
+ errors << I18n.t("vagrant_smartos.config.ip_address_required") if @ip_address.nil?
50
+ errors << I18n.t("vagrant_smartos.config.subnet_mask_required") if @subnet_mask.nil?
51
+ errors << I18n.t("vagrant_smartos.config.gateway_required") if @gateway.nil?
52
+
53
+ { "SmartOS Provider" => errors }
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,74 @@
1
+ puts "I GOT LOADED"
2
+ begin
3
+ require "vagrant"
4
+ rescue LoadError
5
+ raise "The Vagrant SmartOS plugin must be run within Vagrant."
6
+ end
7
+
8
+ # This is a sanity check to make sure no one is attempting to install
9
+ # this into an early Vagrant version.
10
+ if Vagrant::VERSION < "1.2.0"
11
+ raise "The Vagrant SmartOS plugin is only compatible with Vagrant 1.2+"
12
+ end
13
+
14
+ module VagrantPlugins
15
+ module Smartos
16
+ class Plugin < Vagrant.plugin("2")
17
+ name "SmartOS"
18
+ description <<-DESC
19
+ This plugin installs a provider that allows Vagrant to manage
20
+ machines on a SmartOS Hypervisor.
21
+ DESC
22
+
23
+ config(:smartos, :provider) do
24
+ require_relative "config"
25
+ Config
26
+ end
27
+
28
+ provider(:smartos, :parallel => true) do
29
+ # Setup logging and i18n
30
+ setup_logging
31
+ setup_i18n
32
+
33
+ # Return the provider
34
+ require_relative "provider"
35
+ Provider
36
+ end
37
+
38
+ # This initializes the internationalization strings.
39
+ def self.setup_i18n
40
+ I18n.load_path << File.expand_path("locales/en.yml", Smartos.source_root)
41
+ I18n.reload!
42
+ end
43
+
44
+ # This sets up our log level to be whatever VAGRANT_LOG is.
45
+ def self.setup_logging
46
+ require "log4r"
47
+
48
+ level = nil
49
+ begin
50
+ level = Log4r.const_get(ENV["VAGRANT_LOG"].upcase)
51
+ rescue NameError
52
+ # This means that the logging constant wasn't found,
53
+ # which is fine. We just keep `level` as `nil`. But
54
+ # we tell the user.
55
+ level = nil
56
+ end
57
+
58
+ # Some constants, such as "true" resolve to booleans, so the
59
+ # above error checking doesn't catch it. This will check to make
60
+ # sure that the log level is an integer, as Log4r requires.
61
+ level = nil if !level.is_a?(Integer)
62
+
63
+ # Set the logging level on all "vagrant" namespaced
64
+ # logs as long as we have a valid level.
65
+ if level
66
+ logger = Log4r::Logger.new("vagrant_smartos")
67
+ logger.outputters = Log4r::Outputter.stderr
68
+ logger.level = level
69
+ logger = nil
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,158 @@
1
+ require "log4r"
2
+ require "vagrant"
3
+ require 'vagrant/action/builder'
4
+
5
+ module VagrantPlugins
6
+ module Smartos
7
+ class Provider < Vagrant.plugin("2", :provider)
8
+
9
+ include Vagrant::Action::Builtin
10
+
11
+ action_root = Pathname.new(File.expand_path("../action", __FILE__))
12
+ autoload :ConnectHypervisor, action_root.join("connect_hypervisor")
13
+ autoload :IsCreated, action_root.join("is_created")
14
+ autoload :MessageAlreadyCreated, action_root.join("message_already_created")
15
+ autoload :MessageNotCreated, action_root.join("message_not_created")
16
+ autoload :ReadState, action_root.join("read_state")
17
+ autoload :RunInstance, action_root.join("run_instance")
18
+ autoload :SyncFolders, action_root.join("sync_folders")
19
+ autoload :TerminateInstance, action_root.join("terminate_instance")
20
+
21
+ def initialize(machine)
22
+ @machine = machine
23
+ end
24
+
25
+ def action_up
26
+ Vagrant::Action::Builder.new.tap do |b|
27
+ b.use ConfigValidate
28
+ b.use ConnectHypervisor
29
+ b.use Call, IsCreated do |env, b2|
30
+ if env[:result]
31
+ b2.use MessageAlreadyCreated
32
+ next
33
+ end
34
+
35
+ b2.use SyncFolders
36
+ b2.use RunInstance
37
+ end
38
+ end
39
+ end
40
+
41
+ def action_destroy
42
+ Vagrant::Action::Builder.new.tap do |b|
43
+ b.use ConfigValidate
44
+ b.use ConnectHypervisor
45
+ b.use TerminateInstance
46
+ end
47
+
48
+ end
49
+
50
+ def action_provision
51
+ Vagrant::Action::Builder.new.tap do |b|
52
+ b.use ConfigValidate
53
+ b.use Call, IsCreated do |env, b2|
54
+ if !env[:result]
55
+ b2.use MessageNotCreated
56
+ next
57
+ end
58
+
59
+ b2.use Provision
60
+ b2.use SyncFolders
61
+ end
62
+ end
63
+ end
64
+
65
+ def action_read_ssh_info
66
+ Vagrant::Action::Builder.new.tap do |b|
67
+ b.use ConfigValidate
68
+ b.use ConnectHypervisor
69
+ b.use ReadSSHInfo
70
+ end
71
+ end
72
+
73
+ def action_read_state
74
+ Vagrant::Action::Builder.new.tap do |b|
75
+ b.use ConfigValidate
76
+ b.use ConnectHypervisor
77
+ b.use ReadState
78
+ end
79
+ end
80
+
81
+ def action_ssh
82
+ Vagrant::Action::Builder.new.tap do |b|
83
+ b.use ConfigValidate
84
+ b.use Call, IsCreated do |env, b2|
85
+ if !env[:result]
86
+ b2.use MessageNotCreated
87
+ next
88
+ end
89
+
90
+ b2.use SSHExec
91
+ end
92
+ end
93
+ end
94
+
95
+ def action_ssh_run
96
+ Vagrant::Action::Builder.new.tap do |b|
97
+ b.use ConfigValidate
98
+ b.use Call, IsCreated do |env, b2|
99
+ if !env[:result]
100
+ b2.use MessageNotCreated
101
+ next
102
+ end
103
+
104
+ b2.use SSHRun
105
+ end
106
+ end
107
+
108
+ end
109
+
110
+ def action(name)
111
+ case name.intern
112
+ when :up
113
+ action_up
114
+ when :read_state
115
+ action_read_state
116
+ when :destroy
117
+ action_destroy
118
+ when :ssh
119
+ action_ssh
120
+ when :ssh_run
121
+ action_ssh_run
122
+ when :provision
123
+ action_provision
124
+ end
125
+ end
126
+
127
+ def ssh_info
128
+ # Run a custom action called "read_ssh_info" which does what it
129
+ # says and puts the resulting SSH info into the `:machine_ssh_info`
130
+ # key in the environment.
131
+ env = @machine.action("read_state")
132
+
133
+ env[:machine_ssh_info]
134
+ end
135
+
136
+ def state
137
+ # Run a custom action we define called "read_state" which does
138
+ # what it says. It puts the state in the `:machine_state_id`
139
+ # key in the environment.
140
+ env = @machine.action("read_state")
141
+
142
+ state_id = env[:machine_state_id]
143
+
144
+ # Get the short and long description
145
+ short = I18n.t("vagrant_smartos.states.short_#{state_id}")
146
+ long = I18n.t("vagrant_smartos.states.long_#{state_id}")
147
+
148
+ # Return the MachineState object
149
+ Vagrant::MachineState.new(state_id, short, long)
150
+ end
151
+
152
+ def to_s
153
+ id = @machine.id.nil? ? "new" : @machine.id
154
+ "SmartOS (#{id})"
155
+ end
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,5 @@
1
+ module Vagrant
2
+ module Smartos
3
+ VERSION = "0.0.1alpha"
4
+ end
5
+ end
@@ -0,0 +1,20 @@
1
+ require 'pathname'
2
+
3
+ require "vagrant-smartos/version"
4
+ require 'vagrant-smartos/plugin'
5
+
6
+ module VagrantPlugins
7
+ module Smartos
8
+ lib_path = Pathname.new(File.expand_path("../vagrant-smartos", __FILE__))
9
+ #autoload :Action, lib_path.join("action")
10
+ #autoload :Errors, lib_path.join("errors")
11
+
12
+ # This returns the path to the source of this plugin.
13
+ #
14
+ # @return [Pathname]
15
+ def self.source_root
16
+ @source_root ||= Pathname.new(File.expand_path("../../", __FILE__))
17
+ end
18
+
19
+ end
20
+ end
data/locales/en.yml ADDED
@@ -0,0 +1,38 @@
1
+ en:
2
+ vagrant_smartos:
3
+ config:
4
+ hypervisor_required: |-
5
+ A hypervisor must be specified
6
+
7
+ image_uuid_required: |-
8
+ An image_uuid value is required
9
+
10
+ states:
11
+ running_short: |-
12
+ Running
13
+ running_long: |-
14
+ Running
15
+
16
+ not_created: |-
17
+ Not CREATED!
18
+
19
+ already_created: |-
20
+ ALREADY CREATED!
21
+
22
+ launching_instance: |-
23
+ Yo, launching an instance, innit.
24
+
25
+ waiting_for_ready: |-
26
+ Yar, this is taking time. Hang on...
27
+
28
+ waiting_for_ssh: |-
29
+ FFS. Should be done now. Still farting around with SSH.
30
+
31
+ ready: |-
32
+ Finally, the bastard is ready.
33
+
34
+ rsync_folder: |-
35
+ Fucker is out of date. Updating.
36
+
37
+ terminating: |-
38
+ Yeah, I didn't really like it either.
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'vagrant-smartos/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "vagrant-smartos"
8
+ gem.version = Vagrant::Smartos::VERSION
9
+ gem.authors = ["Thomas Haggett"]
10
+ gem.email = ["thomas@haggett.org"]
11
+ gem.description = %q{SmartOS Hypervisor provider for Vagrant}
12
+ gem.summary = %q{SmartOS Hypervisor provider for Vagrant}
13
+ gem.homepage = ""
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency "uuid"
21
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vagrant-smartos
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: true
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1alpha
9
+ version: 0.0.1alpha
10
+ platform: ruby
11
+ authors:
12
+ - Thomas Haggett
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2013-06-06 00:00:00 +01:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: uuid
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :runtime
31
+ version_requirements: *id001
32
+ description: SmartOS Hypervisor provider for Vagrant
33
+ email:
34
+ - thomas@haggett.org
35
+ executables: []
36
+
37
+ extensions: []
38
+
39
+ extra_rdoc_files: []
40
+
41
+ files:
42
+ - .gitignore
43
+ - Gemfile
44
+ - LICENSE.txt
45
+ - README.md
46
+ - Rakefile
47
+ - Vagrantfile
48
+ - example_box/Vagrantfile
49
+ - example_box/metadata.json
50
+ - example_box/smartos.box
51
+ - lib/vagrant-smartos.rb
52
+ - lib/vagrant-smartos/action/connect_hypervisor.rb
53
+ - lib/vagrant-smartos/action/is_created.rb
54
+ - lib/vagrant-smartos/action/message_already_created.rb
55
+ - lib/vagrant-smartos/action/message_not_created.rb
56
+ - lib/vagrant-smartos/action/read_state.rb
57
+ - lib/vagrant-smartos/action/run_instance.rb
58
+ - lib/vagrant-smartos/action/sync_folders.rb
59
+ - lib/vagrant-smartos/action/terminate_instance.rb
60
+ - lib/vagrant-smartos/config.rb
61
+ - lib/vagrant-smartos/plugin.rb
62
+ - lib/vagrant-smartos/provider.rb
63
+ - lib/vagrant-smartos/version.rb
64
+ - locales/en.yml
65
+ - vagrant-smartos.gemspec
66
+ has_rdoc: true
67
+ homepage: ""
68
+ licenses: []
69
+
70
+ post_install_message:
71
+ rdoc_options: []
72
+
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ segments:
80
+ - 0
81
+ version: "0"
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">"
85
+ - !ruby/object:Gem::Version
86
+ segments:
87
+ - 1
88
+ - 3
89
+ - 1
90
+ version: 1.3.1
91
+ requirements: []
92
+
93
+ rubyforge_project:
94
+ rubygems_version: 1.3.6
95
+ signing_key:
96
+ specification_version: 3
97
+ summary: SmartOS Hypervisor provider for Vagrant
98
+ test_files: []
99
+