vagrant-lightsail 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.rubocop.yml +26 -0
- data/.ruby-version +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +12 -0
- data/LICENSE.txt +21 -0
- data/README.md +117 -0
- data/Rakefile +20 -0
- data/box/lightsail.box +0 -0
- data/box/metadata.json +3 -0
- data/lib/vagrant-lightsail/action/connect_lightsail.rb +33 -0
- data/lib/vagrant-lightsail/action/is_created.rb +18 -0
- data/lib/vagrant-lightsail/action/is_stopped.rb +18 -0
- data/lib/vagrant-lightsail/action/message_already_created.rb +16 -0
- data/lib/vagrant-lightsail/action/message_not_created.rb +16 -0
- data/lib/vagrant-lightsail/action/message_will_not_destroy.rb +16 -0
- data/lib/vagrant-lightsail/action/read_ssh_info.rb +38 -0
- data/lib/vagrant-lightsail/action/read_state.rb +46 -0
- data/lib/vagrant-lightsail/action/run_instance.rb +89 -0
- data/lib/vagrant-lightsail/action/setup_key.rb +55 -0
- data/lib/vagrant-lightsail/action/start_instance.rb +40 -0
- data/lib/vagrant-lightsail/action/stop_instance.rb +28 -0
- data/lib/vagrant-lightsail/action/terminate_instance.rb +31 -0
- data/lib/vagrant-lightsail/action/wait_for_state.rb +40 -0
- data/lib/vagrant-lightsail/action.rb +165 -0
- data/lib/vagrant-lightsail/config.rb +125 -0
- data/lib/vagrant-lightsail/errors.rb +17 -0
- data/lib/vagrant-lightsail/plugin.rb +28 -0
- data/lib/vagrant-lightsail/provider.rb +41 -0
- data/lib/vagrant-lightsail/version.rb +5 -0
- data/lib/vagrant-lightsail.rb +13 -0
- data/locales/en.yml +50 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/vagrant/lightsail_spec.rb +11 -0
- data/test/Vagrantfile +21 -0
- data/test/puppet/lightsail/manifests/default.pp +1 -0
- data/test/scripts/provision.sh +3 -0
- data/test/test.sh +33 -0
- data/vagrant-lightsail.gemspec +27 -0
- metadata +160 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Lightsail
|
5
|
+
module Action
|
6
|
+
# This terminates the running instance.
|
7
|
+
class TerminateInstance
|
8
|
+
def initialize(app, _)
|
9
|
+
@app = app
|
10
|
+
@logger = Log4r::Logger.new('vagrant_lightsail::action::terminate_instance')
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
server = env[:lightsail_client].get_instance(instance_name: env[:machine].id).instance
|
15
|
+
|
16
|
+
# Destroy the server and remove the tracking ID
|
17
|
+
env[:ui].info(I18n.t('vagrant_lightsail.terminating'))
|
18
|
+
begin
|
19
|
+
env[:lightsail_client].delete_instance(instance_name: server.name)
|
20
|
+
rescue Aws::Lightsail::Errors => e
|
21
|
+
raise Errors::LightailError, message: e
|
22
|
+
end
|
23
|
+
|
24
|
+
env[:machine].id = nil
|
25
|
+
|
26
|
+
@app.call(env)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
require 'timeout'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Lightsail
|
6
|
+
module Action
|
7
|
+
# This action will wait for a machine to reach a specific state
|
8
|
+
# or quit by timeout
|
9
|
+
class WaitForState
|
10
|
+
# env[:result] will be false in case of timeout.
|
11
|
+
# @param [Symbol] state Target machine state.
|
12
|
+
# @param [Number] timeout Timeout in seconds.
|
13
|
+
def initialize(app, _, state, timeout)
|
14
|
+
@app = app
|
15
|
+
@logger = Log4r::Logger.new('vagrant_lightsail::action::wait_for_state')
|
16
|
+
@state = state
|
17
|
+
@timeout = timeout
|
18
|
+
end
|
19
|
+
|
20
|
+
def call(env)
|
21
|
+
env[:result] = true
|
22
|
+
if env[:machine].state.id == @state
|
23
|
+
@logger.info I18n.t('vagrant_lightsail.already_status', status: @state)
|
24
|
+
else
|
25
|
+
@logger.info "Waiting for machine to reach state #{@state}"
|
26
|
+
begin
|
27
|
+
Timeout.timeout(@timeout) do
|
28
|
+
sleep 2 until env[:machine].state.id == @state
|
29
|
+
end
|
30
|
+
rescue Timeout::Error
|
31
|
+
env[:result] = false # couldn't reach state in time
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
@app.call(env)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Lightsail
|
3
|
+
module Action
|
4
|
+
include Vagrant::Action::Builtin
|
5
|
+
|
6
|
+
# This action is called to read the SSH info of the machine. The
|
7
|
+
# resulting state is expected to be put into the
|
8
|
+
# `:machine_ssh_info` key.
|
9
|
+
def self.read_ssh_info
|
10
|
+
Vagrant::Action::Builder.new.tap do |b|
|
11
|
+
b.use ConfigValidate
|
12
|
+
b.use ConnectLightsail
|
13
|
+
b.use ReadSSHInfo
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# This action is called to read the state of the machine. The
|
18
|
+
# resulting state is expected to be put into the
|
19
|
+
# `:machine_state_id` key.
|
20
|
+
def self.read_state
|
21
|
+
Vagrant::Action::Builder.new.tap do |b|
|
22
|
+
b.use ConfigValidate
|
23
|
+
b.use ConnectLightsail
|
24
|
+
b.use ReadState
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# This action is called to bring the box up from nothing.
|
29
|
+
def self.up
|
30
|
+
Vagrant::Action::Builder.new.tap do |b|
|
31
|
+
b.use HandleBox
|
32
|
+
b.use ConfigValidate
|
33
|
+
b.use BoxCheckOutdated
|
34
|
+
b.use ConnectLightsail
|
35
|
+
b.use Call, IsCreated do |env1, b1|
|
36
|
+
if env1[:result]
|
37
|
+
b1.use Call, IsStopped do |env2, b2|
|
38
|
+
if env2[:result]
|
39
|
+
b2.use prepare_boot
|
40
|
+
b2.use StartInstance # restart this instance
|
41
|
+
else
|
42
|
+
b2.use MessageAlreadyCreated # TODO: write a better message
|
43
|
+
end
|
44
|
+
end
|
45
|
+
else
|
46
|
+
b1.use SetupKey
|
47
|
+
b1.use prepare_boot
|
48
|
+
b1.use RunInstance # launch a new instance
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.prepare_boot
|
55
|
+
Vagrant::Action::Builder.new.tap do |b|
|
56
|
+
b.use Provision
|
57
|
+
b.use SyncedFolders
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# This action is called to terminate the remote machine.
|
62
|
+
def self.destroy
|
63
|
+
Vagrant::Action::Builder.new.tap do |b|
|
64
|
+
b.use Call, DestroyConfirm do |env, b2|
|
65
|
+
if env[:result]
|
66
|
+
b2.use ConfigValidate
|
67
|
+
b2.use Call, IsCreated do |env2, b3|
|
68
|
+
unless env2[:result]
|
69
|
+
b3.use MessageNotCreated
|
70
|
+
next
|
71
|
+
end
|
72
|
+
|
73
|
+
b3.use ConnectLightsail
|
74
|
+
b3.use ProvisionerCleanup, :before if defined? ProvisionerCleanup
|
75
|
+
b3.use TerminateInstance
|
76
|
+
end
|
77
|
+
else
|
78
|
+
b2.use MessageWillNotDestroy
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# This action is called when `vagrant provision` is called.
|
85
|
+
def self.provision
|
86
|
+
Vagrant::Action::Builder.new.tap do |b|
|
87
|
+
b.use ConfigValidate
|
88
|
+
b.use Call, IsCreated do |env, b2|
|
89
|
+
unless env[:result]
|
90
|
+
b2.use MessageNotCreated
|
91
|
+
next
|
92
|
+
end
|
93
|
+
|
94
|
+
b2.use Provision
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.reload
|
100
|
+
Vagrant::Action::Builder.new.tap do |b|
|
101
|
+
b.use ConfigValidate
|
102
|
+
b.use ConnectLightsail
|
103
|
+
b.use Call, IsCreated do |env, b2|
|
104
|
+
unless env[:result]
|
105
|
+
b2.use MessageNotCreated
|
106
|
+
next
|
107
|
+
end
|
108
|
+
|
109
|
+
b2.use halt
|
110
|
+
b2.use up
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
# This action is called to halt the remote machine.
|
116
|
+
def self.halt
|
117
|
+
Vagrant::Action::Builder.new.tap do |b|
|
118
|
+
b.use ConfigValidate
|
119
|
+
b.use Call, IsCreated do |env, b2|
|
120
|
+
unless env[:result]
|
121
|
+
b2.use MessageNotCreated
|
122
|
+
next
|
123
|
+
end
|
124
|
+
|
125
|
+
b2.use ConnectLightsail
|
126
|
+
b2.use StopInstance
|
127
|
+
b2.use WaitForState, :stopped, 120
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# This action is called to SSH into the machine.
|
133
|
+
def self.ssh
|
134
|
+
Vagrant::Action::Builder.new.tap do |b|
|
135
|
+
b.use ConfigValidate
|
136
|
+
b.use Call, IsCreated do |env, b2|
|
137
|
+
unless env[:result]
|
138
|
+
b2.use MessageNotCreated
|
139
|
+
next
|
140
|
+
end
|
141
|
+
|
142
|
+
b2.use SSHExec
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# The autload farm
|
148
|
+
action_root = Pathname.new(File.expand_path('../action', __FILE__))
|
149
|
+
autoload :ConnectLightsail, action_root.join('connect_lightsail')
|
150
|
+
autoload :IsCreated, action_root.join('is_created')
|
151
|
+
autoload :IsStopped, action_root.join('is_stopped')
|
152
|
+
autoload :MessageAlreadyCreated, action_root.join('message_already_created')
|
153
|
+
autoload :MessageNotCreated, action_root.join('message_not_created')
|
154
|
+
autoload :MessageWillNotDestroy, action_root.join('message_will_not_destroy')
|
155
|
+
autoload :ReadSSHInfo, action_root.join('read_ssh_info')
|
156
|
+
autoload :ReadState, action_root.join('read_state')
|
157
|
+
autoload :RunInstance, action_root.join('run_instance')
|
158
|
+
autoload :SetupKey, action_root.join('setup_key')
|
159
|
+
autoload :StartInstance, action_root.join('start_instance')
|
160
|
+
autoload :StopInstance, action_root.join('stop_instance')
|
161
|
+
autoload :TerminateInstance, action_root.join('terminate_instance')
|
162
|
+
autoload :WaitForState, action_root.join('wait_for_state')
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'iniparse'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Lightsail
|
5
|
+
class Config < Vagrant.plugin('2', :config)
|
6
|
+
attr_accessor :access_key_id
|
7
|
+
attr_accessor :availability_zone
|
8
|
+
attr_accessor :aws_dir
|
9
|
+
attr_accessor :aws_profile
|
10
|
+
attr_accessor :blueprint_id
|
11
|
+
attr_accessor :bundle_id
|
12
|
+
attr_accessor :endpoint
|
13
|
+
attr_accessor :keypair_name
|
14
|
+
attr_accessor :region
|
15
|
+
attr_accessor :secret_access_key
|
16
|
+
attr_accessor :session_token
|
17
|
+
attr_accessor :user_data
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@access_key_id = UNSET_VALUE
|
21
|
+
@availability_zone = UNSET_VALUE
|
22
|
+
@aws_dir = UNSET_VALUE
|
23
|
+
@aws_profile = UNSET_VALUE
|
24
|
+
@blueprint_id = UNSET_VALUE
|
25
|
+
@bundle_id = UNSET_VALUE
|
26
|
+
@endpoint = UNSET_VALUE
|
27
|
+
@keypair_name = UNSET_VALUE
|
28
|
+
@region = UNSET_VALUE
|
29
|
+
@secret_access_key = UNSET_VALUE
|
30
|
+
@session_token = UNSET_VALUE
|
31
|
+
@user_data = UNSET_VALUE
|
32
|
+
end
|
33
|
+
|
34
|
+
def finalize!
|
35
|
+
if @access_key_id == UNSET_VALUE || @secret_access_key == UNSET_VALUE
|
36
|
+
@aws_profile = 'default' if @aws_profile == UNSET_VALUE
|
37
|
+
@aws_dir = ENV['HOME'].to_s + '/.aws/' if @aws_dir == UNSET_VALUE
|
38
|
+
|
39
|
+
@aws_region, @access_key_id, @secret_access_key, @session_token = Credentials.new.get_aws_info(@aws_profile, @aws_dir)
|
40
|
+
@region = @aws_region if @region == UNSET_VALUE && !@aws_region.nil?
|
41
|
+
else
|
42
|
+
@aws_profile = nil
|
43
|
+
@aws_dir = nil
|
44
|
+
end
|
45
|
+
|
46
|
+
@blueprint_id = 'ubuntu_16_04' if @blueprint_id == UNSET_VALUE
|
47
|
+
@bundle_id = 'nano_1_0' if @bundle_id == UNSET_VALUE
|
48
|
+
@endpoint = nil if @endpoint == UNSET_VALUE
|
49
|
+
@keypair_name = 'vagrant' if @keypair_name == UNSET_VALUE
|
50
|
+
@region = 'us-east-1' if @region == UNSET_VALUE
|
51
|
+
@availability_zone = "#{@region}a" if @availability_zone == UNSET_VALUE
|
52
|
+
@session_token = nil if @session_token == UNSET_VALUE
|
53
|
+
@user_data = nil if @user_data == UNSET_VALUE
|
54
|
+
end
|
55
|
+
|
56
|
+
def validate(_)
|
57
|
+
errors = []
|
58
|
+
|
59
|
+
if @aws_profile && (@access_key_id.nil? || @secret_access_key.nil? || @region.nil?)
|
60
|
+
errors << I18n.t('vagrant_lightsail.config.aws_info_required',
|
61
|
+
profile: @aws_profile, location: @aws_dir)
|
62
|
+
end
|
63
|
+
|
64
|
+
errors << I18n.t('vagrant_lightsail.config.region_required') if @region.nil?
|
65
|
+
|
66
|
+
{ 'Lightsail Provider' => errors }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
class Credentials < Vagrant.plugin('2', :config)
|
71
|
+
def get_aws_info(profile, location)
|
72
|
+
aws_region, aws_id, aws_secret, aws_token = read_aws_environment
|
73
|
+
|
74
|
+
if aws_id.to_s.empty? || aws_secret.to_s.empty?
|
75
|
+
aws_config = ENV['AWS_CONFIG_FILE'].to_s
|
76
|
+
aws_creds = ENV['AWS_SHARED_CREDENTIALS_FILE'].to_s
|
77
|
+
|
78
|
+
if aws_config.empty? || aws_creds.empty?
|
79
|
+
aws_config = location + 'config'
|
80
|
+
aws_creds = location + 'credentials'
|
81
|
+
end
|
82
|
+
|
83
|
+
if File.exist?(aws_config) && File.exist?(aws_creds)
|
84
|
+
aws_region, aws_id, aws_secret, aws_token = read_aws_files(profile, aws_config, aws_creds)
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
aws_region = nil if aws_region == ''
|
90
|
+
aws_id = nil if aws_id == ''
|
91
|
+
aws_secret = nil if aws_secret == ''
|
92
|
+
aws_token = nil if aws_token == ''
|
93
|
+
|
94
|
+
[aws_region, aws_id, aws_secret, aws_token]
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def read_aws_files(profile, aws_config, aws_creds)
|
100
|
+
conf_profile = profile == 'default' ? profile : 'profile ' + profile
|
101
|
+
|
102
|
+
data_conf = File.read(aws_config)
|
103
|
+
doc_conf = IniParse.parse(data_conf)
|
104
|
+
aws_region = doc_conf[conf_profile]['region']
|
105
|
+
|
106
|
+
data_cred = File.read(aws_creds)
|
107
|
+
doc_cred = IniParse.parse(data_cred)
|
108
|
+
aws_id = doc_cred[profile]['aws_access_key_id']
|
109
|
+
aws_secret = doc_cred[profile]['aws_secret_access_key']
|
110
|
+
aws_token = doc_cred[profile]['aws_session_token']
|
111
|
+
|
112
|
+
[aws_region, aws_id, aws_secret, aws_token]
|
113
|
+
end
|
114
|
+
|
115
|
+
def read_aws_environment
|
116
|
+
aws_region = ENV['AWS_DEFAULT_REGION']
|
117
|
+
aws_id = ENV['AWS_ACCESS_KEY_ID']
|
118
|
+
aws_secret = ENV['AWS_SECRET_ACCESS_KEY']
|
119
|
+
aws_token = ENV['AWS_SESSION_TOKEN']
|
120
|
+
|
121
|
+
[aws_region, aws_id, aws_secret, aws_token]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Lightsail
|
5
|
+
class VagrantLightsailError < Vagrant::Errors::VagrantError
|
6
|
+
error_namespace('vagrant_lightsail.errors')
|
7
|
+
end
|
8
|
+
|
9
|
+
class LightsailError < VagrantLightsailError
|
10
|
+
error_key(:lightsail_error)
|
11
|
+
end
|
12
|
+
|
13
|
+
class PublicKeyError < VagrantLightsailError
|
14
|
+
error_key(:public_key)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Lightsail
|
3
|
+
class Plugin < Vagrant.plugin('2')
|
4
|
+
name 'Lightsail'
|
5
|
+
description <<-DESC
|
6
|
+
This plugin installs a provider that allows Vagrant to manage
|
7
|
+
machines in AWS Lightsail.
|
8
|
+
DESC
|
9
|
+
|
10
|
+
config(:lightsail, :provider) do
|
11
|
+
require_relative 'config'
|
12
|
+
Config
|
13
|
+
end
|
14
|
+
|
15
|
+
provider(:lightsail, parallel: true) do
|
16
|
+
setup_i18n
|
17
|
+
require_relative 'provider'
|
18
|
+
Provider
|
19
|
+
end
|
20
|
+
|
21
|
+
# This initializes the internationalization strings.
|
22
|
+
def self.setup_i18n
|
23
|
+
I18n.load_path << File.expand_path('locales/en.yml', Lightsail.source_root)
|
24
|
+
I18n.reload!
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
require 'vagrant-lightsail/action'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Lightsail
|
6
|
+
class Provider < Vagrant.plugin('2', :provider)
|
7
|
+
def initialize(machine)
|
8
|
+
@machine = machine
|
9
|
+
end
|
10
|
+
|
11
|
+
def action(name)
|
12
|
+
return Action.send(name) if Action.respond_to?(name)
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def ssh_info
|
17
|
+
# Run a custom action called "read_ssh_info" which does what
|
18
|
+
# it says and puts the resulting SSH info into the
|
19
|
+
# `:machine_ssh_info` key in the environment.
|
20
|
+
env = @machine.action('read_ssh_info', lock: false)
|
21
|
+
env[:machine_ssh_info]
|
22
|
+
end
|
23
|
+
|
24
|
+
def state
|
25
|
+
# Run a custom action called "read_state" which does what it
|
26
|
+
# says and puts the state into the `:machine_state_id` key in
|
27
|
+
# the environment.
|
28
|
+
env = @machine.action('read_state', lock: false)
|
29
|
+
|
30
|
+
state_id = env[:machine_state_id]
|
31
|
+
|
32
|
+
# Get the short and long description
|
33
|
+
short = I18n.t("vagrant_lightsail.states.short_#{state_id}")
|
34
|
+
long = I18n.t("vagrant_lightsail.states.long_#{state_id}")
|
35
|
+
|
36
|
+
# Return the MachineState object
|
37
|
+
Vagrant::MachineState.new(state_id, short, long)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'vagrant-lightsail/version'
|
2
|
+
require 'vagrant-lightsail/plugin'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Lightsail
|
6
|
+
# This returns the path to the source of this plugin.
|
7
|
+
#
|
8
|
+
# @return [Pathname]
|
9
|
+
def self.source_root
|
10
|
+
@source_root ||= Pathname.new(File.expand_path('../../', __FILE__))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/locales/en.yml
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
en:
|
2
|
+
vagrant_lightsail:
|
3
|
+
|
4
|
+
config:
|
5
|
+
aws_info_required: |-
|
6
|
+
One or more of the needed AWS credentials are missing. No
|
7
|
+
environment variables are set nor profile '%{profile}' exists
|
8
|
+
at '%{location}'
|
9
|
+
region_required: |-
|
10
|
+
A region must be specified via "region"
|
11
|
+
|
12
|
+
errors:
|
13
|
+
lightsail_error: |-
|
14
|
+
There was an error talking to AWS. The error message is shown
|
15
|
+
below:
|
16
|
+
|
17
|
+
%{message}
|
18
|
+
public_key: |-
|
19
|
+
There was an issue reading the public key at:
|
20
|
+
|
21
|
+
Path: %{path}
|
22
|
+
|
23
|
+
Please check the file's permissions.
|
24
|
+
|
25
|
+
already_status: |-
|
26
|
+
The machine is already %{status}.
|
27
|
+
creating_key: |-
|
28
|
+
Creating new SSH key %{name}...
|
29
|
+
launching_instance: |-
|
30
|
+
Launching an instance with the following settings...
|
31
|
+
launch_no_keypair: |-
|
32
|
+
Warning! You didn't specify a keypair to launch your instance with.
|
33
|
+
This can sometimes result in not being able to access your instance.
|
34
|
+
not_created: |-
|
35
|
+
Instance is not created. Please run `vagrant up` first.
|
36
|
+
ready: |-
|
37
|
+
Machine is booted and ready for use!
|
38
|
+
starting: |-
|
39
|
+
Starting the instance...
|
40
|
+
stopping: |-
|
41
|
+
Stopping the instance...
|
42
|
+
terminating: |-
|
43
|
+
Terminating the instance...
|
44
|
+
waiting_for_ready: |-
|
45
|
+
Waiting for instance to become "ready"...
|
46
|
+
waiting_for_ssh: |-
|
47
|
+
Waiting for SSH to become available...
|
48
|
+
will_not_destroy: |-
|
49
|
+
The instance '%{name}' will not be destroyed, since the
|
50
|
+
confirmation was declined.
|
data/spec/spec_helper.rb
ADDED
data/test/Vagrantfile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Vagrant.require_plugin('vagrant-lightsail')
|
2
|
+
|
3
|
+
Vagrant.configure('2') do |config|
|
4
|
+
config.ssh.private_key_path = '~/.ssh/id_rsa'
|
5
|
+
|
6
|
+
config.vm.synced_folder '.', '/vagrant', disabled: true
|
7
|
+
|
8
|
+
config.vm.provider :lightsail do |provider, override|
|
9
|
+
override.vm.box = 'lightsail'
|
10
|
+
override.vm.box_url = 'https://github.com/thejandroman/vagrant-lightsail/raw/master/box/lightsail.box'
|
11
|
+
override.ssh.username = 'ubuntu'
|
12
|
+
provider.keypair_name = 'Test-Key'
|
13
|
+
end
|
14
|
+
|
15
|
+
config.vm.provision :shell, path: 'scripts/provision.sh'
|
16
|
+
config.puppet_install.puppet_version = :latest
|
17
|
+
config.vm.provision 'puppet' do |puppet|
|
18
|
+
puppet.environment_path = 'puppet'
|
19
|
+
puppet.environment = 'lightsail'
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
notify { 'Testing 1 2 3!': }
|
data/test/test.sh
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
destroy() {
|
4
|
+
ANSWER=$1
|
5
|
+
read -r -d '' EXPECT_CMD <<EOF
|
6
|
+
spawn bundle exec vagrant destroy
|
7
|
+
expect {Are you sure you want to destroy}
|
8
|
+
send "$ANSWER\r"
|
9
|
+
interact
|
10
|
+
EOF
|
11
|
+
expect -c "$EXPECT_CMD"
|
12
|
+
}
|
13
|
+
|
14
|
+
if ! bundle exec vagrant box list | grep lightsail 1>/dev/null; then
|
15
|
+
bundle exec vagrant box add box/lightsail.box
|
16
|
+
fi
|
17
|
+
|
18
|
+
cd test || exit
|
19
|
+
|
20
|
+
bundle exec vagrant up --provider=lightsail
|
21
|
+
bundle exec vagrant up
|
22
|
+
bundle exec vagrant provision
|
23
|
+
bundle exec vagrant reload
|
24
|
+
bundle exec vagrant halt
|
25
|
+
bundle exec vagrant up
|
26
|
+
destroy 'N'
|
27
|
+
bundle exec vagrant destroy --force
|
28
|
+
exit
|
29
|
+
destroy 'N'
|
30
|
+
destroy 'y'
|
31
|
+
bundle exec vagrant destroy --force
|
32
|
+
bundle exec vagrant provision
|
33
|
+
bundle exec vagrant reload
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'vagrant-lightsail/version'
|
5
|
+
require 'English'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'vagrant-lightsail'
|
9
|
+
spec.version = VagrantPlugins::Lightsail::VERSION
|
10
|
+
spec.authors = ['Alejandro Figueroa']
|
11
|
+
spec.email = ['alejandro@ideasftw.com']
|
12
|
+
spec.summary = 'Enables Vagrant to manage machines in AWS Lightsail.'
|
13
|
+
spec.description = 'Enables Vagrant to manage machines in AWS Lightsail.'
|
14
|
+
spec.homepage = 'http://github.com/thejandroman/vagrant-lightsail'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_runtime_dependency 'aws-sdk', '~> 2.6'
|
22
|
+
spec.add_runtime_dependency 'iniparse', '~> 1.4'
|
23
|
+
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.12'
|
25
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
26
|
+
spec.add_development_dependency 'rubocop', '~> 0.46'
|
27
|
+
end
|