vagrant-lightsail 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +26 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +5 -0
  7. data/Gemfile +12 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +117 -0
  10. data/Rakefile +20 -0
  11. data/box/lightsail.box +0 -0
  12. data/box/metadata.json +3 -0
  13. data/lib/vagrant-lightsail/action/connect_lightsail.rb +33 -0
  14. data/lib/vagrant-lightsail/action/is_created.rb +18 -0
  15. data/lib/vagrant-lightsail/action/is_stopped.rb +18 -0
  16. data/lib/vagrant-lightsail/action/message_already_created.rb +16 -0
  17. data/lib/vagrant-lightsail/action/message_not_created.rb +16 -0
  18. data/lib/vagrant-lightsail/action/message_will_not_destroy.rb +16 -0
  19. data/lib/vagrant-lightsail/action/read_ssh_info.rb +38 -0
  20. data/lib/vagrant-lightsail/action/read_state.rb +46 -0
  21. data/lib/vagrant-lightsail/action/run_instance.rb +89 -0
  22. data/lib/vagrant-lightsail/action/setup_key.rb +55 -0
  23. data/lib/vagrant-lightsail/action/start_instance.rb +40 -0
  24. data/lib/vagrant-lightsail/action/stop_instance.rb +28 -0
  25. data/lib/vagrant-lightsail/action/terminate_instance.rb +31 -0
  26. data/lib/vagrant-lightsail/action/wait_for_state.rb +40 -0
  27. data/lib/vagrant-lightsail/action.rb +165 -0
  28. data/lib/vagrant-lightsail/config.rb +125 -0
  29. data/lib/vagrant-lightsail/errors.rb +17 -0
  30. data/lib/vagrant-lightsail/plugin.rb +28 -0
  31. data/lib/vagrant-lightsail/provider.rb +41 -0
  32. data/lib/vagrant-lightsail/version.rb +5 -0
  33. data/lib/vagrant-lightsail.rb +13 -0
  34. data/locales/en.yml +50 -0
  35. data/spec/spec_helper.rb +2 -0
  36. data/spec/vagrant/lightsail_spec.rb +11 -0
  37. data/test/Vagrantfile +21 -0
  38. data/test/puppet/lightsail/manifests/default.pp +1 -0
  39. data/test/scripts/provision.sh +3 -0
  40. data/test/test.sh +33 -0
  41. data/vagrant-lightsail.gemspec +27 -0
  42. 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,5 @@
1
+ module VagrantPlugins
2
+ module Lightsail
3
+ VERSION = '0.1.0'.freeze
4
+ end
5
+ 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.
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'vagrant-lightsail'
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe VagrantPlugins::Lightsail do
4
+ it 'has a version number' do
5
+ expect(VagrantPlugins::Lightsail::VERSION).not_to be nil
6
+ end
7
+
8
+ it 'does something useful' do
9
+ expect(false).to eq(true)
10
+ end
11
+ end
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!': }
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ echo '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