vagrant-oneandone 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +33 -0
- data/.rspec +2 -0
- data/.rubocop.yml +29 -0
- data/.travis.yml +16 -0
- data/Gemfile +12 -0
- data/LICENSE +201 -0
- data/README.md +275 -0
- data/Rakefile +33 -0
- data/box/README.md +13 -0
- data/box/Vagrantfile +7 -0
- data/box/dummy.box +0 -0
- data/box/metadata.json +3 -0
- data/examples/01_coreos_simple/Vagrantfile +12 -0
- data/examples/02_django_centos7_app/Vagrantfile +14 -0
- data/examples/03_ubuntu12.04_shell_provision/Vagrantfile +19 -0
- data/examples/04_parallel_servers/Vagrantfile +26 -0
- data/examples/05_debian8_docker_provision/Vagrantfile +17 -0
- data/lib/vagrant-oneandone.rb +26 -0
- data/lib/vagrant-oneandone/action.rb +163 -0
- data/lib/vagrant-oneandone/action/connect_1and1.rb +28 -0
- data/lib/vagrant-oneandone/action/create.rb +76 -0
- data/lib/vagrant-oneandone/action/destroy.rb +69 -0
- data/lib/vagrant-oneandone/action/get_state.rb +17 -0
- data/lib/vagrant-oneandone/action/power_off.rb +49 -0
- data/lib/vagrant-oneandone/action/power_on.rb +39 -0
- data/lib/vagrant-oneandone/action/read_ssh_info.rb +54 -0
- data/lib/vagrant-oneandone/action/read_state.rb +44 -0
- data/lib/vagrant-oneandone/action/reload.rb +48 -0
- data/lib/vagrant-oneandone/command/list_appliances.rb +38 -0
- data/lib/vagrant-oneandone/command/list_datacenters.rb +36 -0
- data/lib/vagrant-oneandone/command/list_firewalls.rb +32 -0
- data/lib/vagrant-oneandone/command/list_ips.rb +45 -0
- data/lib/vagrant-oneandone/command/list_load_balancers.rb +43 -0
- data/lib/vagrant-oneandone/command/list_monitor_policies.rb +32 -0
- data/lib/vagrant-oneandone/command/list_servers.rb +32 -0
- data/lib/vagrant-oneandone/command/list_sizes.rb +43 -0
- data/lib/vagrant-oneandone/command/main.rb +85 -0
- data/lib/vagrant-oneandone/command/utils.rb +31 -0
- data/lib/vagrant-oneandone/config.rb +65 -0
- data/lib/vagrant-oneandone/config_resolver.rb +97 -0
- data/lib/vagrant-oneandone/errors.rb +45 -0
- data/lib/vagrant-oneandone/plugin.rb +36 -0
- data/lib/vagrant-oneandone/provider.rb +41 -0
- data/lib/vagrant-oneandone/version.rb +5 -0
- data/locales/en.yml +124 -0
- data/vagrant-oneandone.gemspec +29 -0
- data/vagrant-spec.config.rb +9 -0
- metadata +189 -0
data/Rakefile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
# Do not buffer output
|
7
|
+
$stdout.sync = true
|
8
|
+
$stderr.sync = true
|
9
|
+
|
10
|
+
# Change to the directory of this file.
|
11
|
+
Dir.chdir(File.expand_path('../', __FILE__))
|
12
|
+
|
13
|
+
namespace :spec do
|
14
|
+
desc 'Run acceptance specs'
|
15
|
+
task :acceptance do
|
16
|
+
components = %w(
|
17
|
+
general
|
18
|
+
commands
|
19
|
+
).map { |s| "provider/oneandone/#{s}" }
|
20
|
+
|
21
|
+
exec "bundle exec vagrant-spec test --components=#{components.join(' ')}"
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'Run unit specs using RSpec'
|
25
|
+
RSpec::Core::RakeTask.new('unit') do |t|
|
26
|
+
t.pattern = './unit/**/*_spec.rb'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
desc 'Run all tests'
|
31
|
+
task spec: ['spec:unit', 'spec:acceptance']
|
32
|
+
|
33
|
+
task default: 'spec:unit'
|
data/box/README.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Vagrant OneAndOne Example Box
|
2
|
+
|
3
|
+
Vagrant providers each require a custom provider-specific box format.
|
4
|
+
This folder shows the example contents of a box for the `oneandone` provider.
|
5
|
+
To turn this into a box:
|
6
|
+
|
7
|
+
```
|
8
|
+
$ tar cvzf oneandone.box ./metadata.json ./Vagrantfile
|
9
|
+
```
|
10
|
+
|
11
|
+
This box works by using Vagrant's built-in Vagrantfile merging to setup
|
12
|
+
defaults for Oneandone. These defaults can easily be overwritten by higher-level
|
13
|
+
Vagrantfiles (such as project root Vagrantfiles).
|
data/box/Vagrantfile
ADDED
data/box/dummy.box
ADDED
Binary file
|
data/box/metadata.json
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
Vagrant.configure('2') do |config|
|
5
|
+
config.vm.box = 'dummy'
|
6
|
+
config.ssh.private_key_path = '~/.ssh/id_rsa'
|
7
|
+
|
8
|
+
config.vm.provider :oneandone do |server|
|
9
|
+
server.name = 'vagrant-coreos'
|
10
|
+
server.appliance = 'CoreOS_Stable_64std'
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
Vagrant.configure('2') do |config|
|
5
|
+
config.vm.box = 'dummy'
|
6
|
+
config.ssh.private_key_path = '~/.ssh/id_rsa'
|
7
|
+
|
8
|
+
config.vm.provider :oneandone do |server|
|
9
|
+
server.name = 'django-db-server'
|
10
|
+
server.appliance = 'django'
|
11
|
+
server.datacenter = 'DE' # Germany
|
12
|
+
server.fixed_size = 'L'
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
Vagrant.configure('2') do |config|
|
5
|
+
config.vm.hostname = 'ubuntu1204-server-example'
|
6
|
+
config.vm.box = 'dummy'
|
7
|
+
config.ssh.private_key_path = '~/.ssh/id_rsa'
|
8
|
+
config.ssh.pty = true
|
9
|
+
|
10
|
+
config.vm.provider :oneandone do |oneandone|
|
11
|
+
oneandone.appliance = 'ubuntu1204-64std'
|
12
|
+
oneandone.datacenter = 'ES' # Spain
|
13
|
+
oneandone.fixed_size = 'S'
|
14
|
+
end
|
15
|
+
|
16
|
+
config.vm.provision 'shell' do |s|
|
17
|
+
s.inline = 'apt-get update && apt-get install -y'
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
Vagrant.configure('2') do |config|
|
5
|
+
config.vm.box = 'dummy'
|
6
|
+
config.ssh.private_key_path = '~/.ssh/id_rsa'
|
7
|
+
|
8
|
+
config.vm.define :centos do |centos|
|
9
|
+
centos.ssh.pty = true
|
10
|
+
centos.vm.provider :oneandone do |vm|
|
11
|
+
vm.name = 'worker1'
|
12
|
+
vm.description = 'worker node 1'
|
13
|
+
vm.appliance = 'centos7-64std'
|
14
|
+
vm.datacenter = 'US'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
config.vm.define :ubuntu do |ubuntu|
|
19
|
+
ubuntu.vm.provider :oneandone do |vm|
|
20
|
+
vm.name = 'worker2'
|
21
|
+
vm.description = 'worker node 2'
|
22
|
+
vm.appliance = 'ubuntu1604-64std'
|
23
|
+
vm.datacenter = 'US'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
Vagrant.configure('2') do |config|
|
5
|
+
config.vm.box = 'dummy'
|
6
|
+
config.ssh.private_key_path = '~/.ssh/id_rsa'
|
7
|
+
|
8
|
+
config.vm.provider :oneandone do |oneandone|
|
9
|
+
oneandone.name = 'debian8-docker'
|
10
|
+
oneandone.appliance = 'debian8-64std'
|
11
|
+
oneandone.datacenter = 'GB' # United Kingdom
|
12
|
+
oneandone.fixed_size = 'XL'
|
13
|
+
end
|
14
|
+
|
15
|
+
config.vm.provision 'docker' do |d|
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'vagrant-oneandone/plugin'
|
3
|
+
require 'vagrant-oneandone/version'
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module OneAndOne
|
7
|
+
lib_path = Pathname.new(File.expand_path('../vagrant-oneandone', __FILE__))
|
8
|
+
autoload :Action, lib_path.join('action')
|
9
|
+
autoload :Errors, lib_path.join('errors')
|
10
|
+
|
11
|
+
def self.source_root
|
12
|
+
@source_root ||= Pathname.new(File.expand_path('../../', __FILE__))
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.public_key(private_key_path)
|
16
|
+
File.read("#{private_key_path}.pub")
|
17
|
+
rescue
|
18
|
+
raise Errors::PublicKeyError, key: "#{private_key_path}.pub"
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.init_i18n
|
22
|
+
I18n.load_path << File.expand_path('locales/en.yml', source_root)
|
23
|
+
I18n.reload!
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
require 'vagrant/action/builder'
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module OneAndOne
|
7
|
+
module Action
|
8
|
+
include Vagrant::Action::Builtin
|
9
|
+
|
10
|
+
action_root = Pathname.new(File.expand_path('../action', __FILE__))
|
11
|
+
autoload :Create, action_root.join('create')
|
12
|
+
autoload :Destroy, action_root.join('destroy')
|
13
|
+
autoload :Connect1And1, action_root.join('connect_1and1')
|
14
|
+
autoload :GetState, action_root.join('get_state')
|
15
|
+
autoload :PowerOff, action_root.join('power_off')
|
16
|
+
autoload :PowerOn, action_root.join('power_on')
|
17
|
+
autoload :ReadSSHInfo, action_root.join('read_ssh_info')
|
18
|
+
autoload :ReadState, action_root.join('read_state')
|
19
|
+
autoload :Reload, action_root.join('reload')
|
20
|
+
|
21
|
+
def self.action_destroy
|
22
|
+
Vagrant::Action::Builder.new.tap do |b|
|
23
|
+
b.use ConfigValidate
|
24
|
+
b.use Call, GetState do |env, b1|
|
25
|
+
if env[:machine_state] != :not_created
|
26
|
+
b1.use Call, DestroyConfirm do |env2, b2|
|
27
|
+
if env2[:result]
|
28
|
+
b2.use Connect1And1
|
29
|
+
b2.use Destroy
|
30
|
+
b2.use ProvisionerCleanup if defined?(ProvisionerCleanup)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
else
|
34
|
+
env[:ui].info I18n.t('vagrant_1and1.not_created')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.action_halt
|
41
|
+
Vagrant::Action::Builder.new.tap do |b|
|
42
|
+
b.use ConfigValidate
|
43
|
+
b.use Connect1And1
|
44
|
+
b.use Call, GetState do |env, b1|
|
45
|
+
case env[:machine_state]
|
46
|
+
when :active
|
47
|
+
b1.use PowerOff
|
48
|
+
when :off
|
49
|
+
env[:ui].info I18n.t('vagrant_1and1.already_stopped')
|
50
|
+
when :not_created
|
51
|
+
env[:ui].info I18n.t('vagrant_1and1.not_created')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.action_read_ssh_info
|
58
|
+
Vagrant::Action::Builder.new.tap do |b|
|
59
|
+
b.use ConfigValidate
|
60
|
+
b.use Connect1And1
|
61
|
+
b.use ReadSSHInfo
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# This action is called to read the state of the machine. The
|
66
|
+
# resulting state is put into the `env[:machine_state_id]`.
|
67
|
+
def self.action_read_state
|
68
|
+
Vagrant::Action::Builder.new.tap do |b|
|
69
|
+
b.use ConfigValidate
|
70
|
+
b.use Connect1And1
|
71
|
+
b.use ReadState
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.action_reload
|
76
|
+
Vagrant::Action::Builder.new.tap do |b|
|
77
|
+
b.use ConfigValidate
|
78
|
+
b.use Connect1And1
|
79
|
+
b.use Call, GetState do |env, b1|
|
80
|
+
case env[:machine_state]
|
81
|
+
when :active
|
82
|
+
b1.use Reload
|
83
|
+
b1.use Provision
|
84
|
+
when :off
|
85
|
+
env[:ui].info I18n.t('vagrant_1and1.states.long_off')
|
86
|
+
when :not_created
|
87
|
+
env[:ui].info I18n.t('vagrant_1and1.not_created')
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.action_provision
|
94
|
+
Vagrant::Action::Builder.new.tap do |b|
|
95
|
+
b.use ConfigValidate
|
96
|
+
b.use Call, GetState do |env, b1|
|
97
|
+
case env[:machine_state]
|
98
|
+
when :active
|
99
|
+
b1.use Provision
|
100
|
+
when :off
|
101
|
+
env[:ui].info I18n.t('vagrant_1and1.states.long_off')
|
102
|
+
when :not_created
|
103
|
+
env[:ui].info I18n.t('vagrant_1and1.not_created')
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.action_ssh
|
110
|
+
Vagrant::Action::Builder.new.tap do |b|
|
111
|
+
b.use ConfigValidate
|
112
|
+
b.use Connect1And1
|
113
|
+
b.use Call, GetState do |env, b1|
|
114
|
+
case env[:machine_state]
|
115
|
+
when :active
|
116
|
+
b1.use SSHExec
|
117
|
+
when :off
|
118
|
+
env[:ui].info I18n.t('vagrant_1and1.states.long_off')
|
119
|
+
when :not_created
|
120
|
+
env[:ui].info I18n.t('vagrant_1and1.not_created')
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.action_ssh_run
|
127
|
+
Vagrant::Action::Builder.new.tap do |b|
|
128
|
+
b.use ConfigValidate
|
129
|
+
b.use Connect1And1
|
130
|
+
b.use Call, GetState do |env, b1|
|
131
|
+
case env[:machine_state]
|
132
|
+
when :active
|
133
|
+
b1.use SSHRun
|
134
|
+
when :off
|
135
|
+
env[:ui].info I18n.t('vagrant_1and1.states.long_off')
|
136
|
+
when :not_created
|
137
|
+
env[:ui].info I18n.t('vagrant_1and1.not_created')
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def self.action_up
|
144
|
+
Vagrant::Action::Builder.new.tap do |b|
|
145
|
+
b.use ConfigValidate
|
146
|
+
b.use Connect1And1
|
147
|
+
b.use Call, GetState do |env, b1|
|
148
|
+
case env[:machine_state]
|
149
|
+
when :not_created
|
150
|
+
b1.use Create
|
151
|
+
b1.use Provision
|
152
|
+
when :off
|
153
|
+
b1.use PowerOn
|
154
|
+
b1.use Provision
|
155
|
+
else
|
156
|
+
env[:ui].info I18n.t('vagrant_1and1.already_created')
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'fog-oneandone'
|
2
|
+
require 'log4r'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module OneAndOne
|
6
|
+
module Action
|
7
|
+
class Connect1And1
|
8
|
+
def initialize(app, _env)
|
9
|
+
@app = app
|
10
|
+
@logger = Log4r::Logger.new('vagrant_1and1::action::connect_1and1')
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
config = env[:machine].provider_config
|
15
|
+
api_key = config.api_key
|
16
|
+
|
17
|
+
params = {
|
18
|
+
oneandone_api_key: api_key
|
19
|
+
}
|
20
|
+
|
21
|
+
env[:oneandone_compute] = Fog::Compute::OneAndOne.new params
|
22
|
+
|
23
|
+
@app.call(env)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
|
3
|
+
require 'vagrant-oneandone/config_resolver'
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module OneAndOne
|
7
|
+
module Action
|
8
|
+
class Create
|
9
|
+
def initialize(app, env)
|
10
|
+
@app = app
|
11
|
+
@machine = env[:machine]
|
12
|
+
@compute = env[:oneandone_compute]
|
13
|
+
@logger = Log4r::Logger.new('vagrant_1and1::action::create')
|
14
|
+
@resolver = ConfigResolver.new(env)
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
# send new server request
|
19
|
+
server = @compute.servers.create(
|
20
|
+
name: @machine.provider_config.name || @machine.config.vm.hostname,
|
21
|
+
description: @machine.provider_config.description,
|
22
|
+
fixed_instance_id: @resolver.resolve_fixed_instance_size(env),
|
23
|
+
appliance_id: @resolver.resolve_appliance(env),
|
24
|
+
datacenter_id: @resolver.resolve_datacenter(env),
|
25
|
+
rsa_key: @resolver.resolve_ssh_key(env),
|
26
|
+
ip_id: @resolver.resolve_public_ip(env),
|
27
|
+
firewall_id: @machine.provider_config.firewall_id,
|
28
|
+
load_balancer_id: @machine.provider_config.load_balancer_id,
|
29
|
+
monitoring_policy_id: @machine.provider_config.monitoring_policy_id
|
30
|
+
)
|
31
|
+
|
32
|
+
env[:ui].info I18n.t('vagrant_1and1.creating_server')
|
33
|
+
|
34
|
+
# set timeout
|
35
|
+
Fog.timeout = if @machine.provider_config.timeout.nil?
|
36
|
+
1800
|
37
|
+
else
|
38
|
+
@machine.provider_config.timeout
|
39
|
+
end
|
40
|
+
# wait for the request to complete
|
41
|
+
server.wait_for { ready? }
|
42
|
+
|
43
|
+
@machine.id = server.id
|
44
|
+
env[:ui].info(" -- Server Name: #{server.name}")
|
45
|
+
env[:ui].info(" -- Server Size: #{@machine.provider_config.fixed_size}")
|
46
|
+
env[:ui].info(" -- Server Appliance: #{@machine.provider_config.appliance}")
|
47
|
+
env[:ui].info(" -- Data Center: #{@machine.provider_config.datacenter}")
|
48
|
+
ip = begin
|
49
|
+
server.ips[0]['ip']
|
50
|
+
rescue
|
51
|
+
''
|
52
|
+
end
|
53
|
+
env[:ui].info(" -- Public IP: #{ip}")
|
54
|
+
|
55
|
+
env[:ui].info(I18n.t('vagrant_1and1.ready'))
|
56
|
+
|
57
|
+
@app.call(env)
|
58
|
+
end
|
59
|
+
|
60
|
+
def recover(env)
|
61
|
+
return if env['vagrant.error'].is_a?(Vagrant::Errors::VagrantError)
|
62
|
+
|
63
|
+
terminate(env) if @machine.state.id != :not_created
|
64
|
+
end
|
65
|
+
|
66
|
+
def terminate(env)
|
67
|
+
destroy_env = env.dup
|
68
|
+
destroy_env.delete(:interrupted)
|
69
|
+
destroy_env[:config_validate] = false
|
70
|
+
destroy_env[:force_confirm_destroy] = true
|
71
|
+
env[:action_runner].run(Actions.destroy, destroy_env)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|