vagrant-oneandone 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'vagrant-oneandone/command/utils'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OneAndOne
|
5
|
+
module Command
|
6
|
+
class ListLoadBalancers < Vagrant.plugin('2', :command)
|
7
|
+
include VagrantPlugins::OneAndOne::Command::Utils
|
8
|
+
|
9
|
+
def execute
|
10
|
+
options = OptionParser.new do |o|
|
11
|
+
o.banner = I18n.t('vagrant_1and1.command.list_load_balancers')
|
12
|
+
o.separator ''
|
13
|
+
o.separator 'Usage: vagrant oneandone loadbalancers [<api_key>]'
|
14
|
+
o.separator ''
|
15
|
+
end
|
16
|
+
|
17
|
+
argv = parse_options(options)
|
18
|
+
return unless argv
|
19
|
+
|
20
|
+
compute = fog_oneandone(argv[0])
|
21
|
+
|
22
|
+
rows = []
|
23
|
+
compute.list_load_balancers.body.each do |lb|
|
24
|
+
rows << [
|
25
|
+
lb['id'],
|
26
|
+
lb['name'],
|
27
|
+
lb['ip'],
|
28
|
+
lb['method'],
|
29
|
+
lb['state'],
|
30
|
+
lb['datacenter']['country_code']
|
31
|
+
]
|
32
|
+
end
|
33
|
+
|
34
|
+
display_table(
|
35
|
+
@env,
|
36
|
+
['ID', 'Name', 'IP Address', 'Method', 'State', 'Data Center'],
|
37
|
+
rows
|
38
|
+
)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'vagrant-oneandone/command/utils'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OneAndOne
|
5
|
+
module Command
|
6
|
+
class ListMonitorPolicies < Vagrant.plugin('2', :command)
|
7
|
+
include VagrantPlugins::OneAndOne::Command::Utils
|
8
|
+
|
9
|
+
def execute
|
10
|
+
options = OptionParser.new do |o|
|
11
|
+
o.banner = I18n.t('vagrant_1and1.command.list_monitor_policies')
|
12
|
+
o.separator ''
|
13
|
+
o.separator 'Usage: vagrant oneandone monitors [<api_key>]'
|
14
|
+
o.separator ''
|
15
|
+
end
|
16
|
+
|
17
|
+
argv = parse_options(options)
|
18
|
+
return unless argv
|
19
|
+
|
20
|
+
compute = fog_oneandone(argv[0])
|
21
|
+
|
22
|
+
rows = []
|
23
|
+
compute.monitoring_policies.all.each do |mp|
|
24
|
+
rows << [mp.id, mp.name, mp.email, mp.state, mp.agent ? 'yes' : 'no']
|
25
|
+
end
|
26
|
+
|
27
|
+
display_table(@env, %w(ID Name Email State Agent), rows)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'vagrant-oneandone/command/utils'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OneAndOne
|
5
|
+
module Command
|
6
|
+
class ListServers < Vagrant.plugin('2', :command)
|
7
|
+
include VagrantPlugins::OneAndOne::Command::Utils
|
8
|
+
|
9
|
+
def execute
|
10
|
+
options = OptionParser.new do |o|
|
11
|
+
o.banner = I18n.t('vagrant_1and1.command.list_servers')
|
12
|
+
o.separator ''
|
13
|
+
o.separator 'Usage: vagrant oneandone servers [<api_key>]'
|
14
|
+
o.separator ''
|
15
|
+
end
|
16
|
+
|
17
|
+
argv = parse_options(options)
|
18
|
+
return unless argv
|
19
|
+
|
20
|
+
compute = fog_oneandone(argv[0])
|
21
|
+
|
22
|
+
rows = []
|
23
|
+
compute.servers.all.each do |s|
|
24
|
+
rows << [s.id, s.name, s.status['state'], s.datacenter['country_code']]
|
25
|
+
end
|
26
|
+
|
27
|
+
display_table(@env, ['ID', 'Name', 'State', 'Data Center'], rows)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'vagrant-oneandone/command/utils'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OneAndOne
|
5
|
+
module Command
|
6
|
+
class ListSizes < Vagrant.plugin('2', :command)
|
7
|
+
include VagrantPlugins::OneAndOne::Command::Utils
|
8
|
+
|
9
|
+
def execute
|
10
|
+
options = OptionParser.new do |o|
|
11
|
+
o.banner = I18n.t('vagrant_1and1.command.list_sizes')
|
12
|
+
o.separator ''
|
13
|
+
o.separator 'Usage: vagrant oneandone sizes [<api_key>]'
|
14
|
+
o.separator ''
|
15
|
+
end
|
16
|
+
|
17
|
+
argv = parse_options(options)
|
18
|
+
return unless argv
|
19
|
+
|
20
|
+
compute = fog_oneandone(argv[0])
|
21
|
+
|
22
|
+
rows = []
|
23
|
+
compute.list_fixed_servers.body.each do |s|
|
24
|
+
rows << [
|
25
|
+
s['id'],
|
26
|
+
s['name'],
|
27
|
+
s['hardware']['ram'],
|
28
|
+
s['hardware']['vcore'],
|
29
|
+
s['hardware']['cores_per_processor'],
|
30
|
+
s['hardware']['hdds'][0]['size']
|
31
|
+
]
|
32
|
+
end
|
33
|
+
|
34
|
+
display_table(
|
35
|
+
@env,
|
36
|
+
['ID', 'Name', 'RAM (GB)', 'CPU No.', 'Cores per CPU', 'Disk Size (GB)'],
|
37
|
+
rows
|
38
|
+
)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'vagrant-oneandone/action'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OneAndOne
|
5
|
+
module Command
|
6
|
+
class Main < Vagrant.plugin('2', :command)
|
7
|
+
def self.synopsis
|
8
|
+
I18n.t('vagrant_1and1.command.synopsis')
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(argv, env)
|
12
|
+
@main_args, @sub_command, @sub_args = split_main_and_subcommand(argv)
|
13
|
+
|
14
|
+
@subcommands = Vagrant::Registry.new
|
15
|
+
|
16
|
+
@subcommands.register(:appliances) do
|
17
|
+
require File.expand_path('../list_appliances', __FILE__)
|
18
|
+
ListAppliances
|
19
|
+
end
|
20
|
+
@subcommands.register(:datacenters) do
|
21
|
+
require File.expand_path('../list_datacenters', __FILE__)
|
22
|
+
ListDatacenters
|
23
|
+
end
|
24
|
+
@subcommands.register(:firewalls) do
|
25
|
+
require File.expand_path('../list_firewalls', __FILE__)
|
26
|
+
ListFirewalls
|
27
|
+
end
|
28
|
+
@subcommands.register(:ips) do
|
29
|
+
require File.expand_path('../list_ips', __FILE__)
|
30
|
+
ListIPs
|
31
|
+
end
|
32
|
+
@subcommands.register(:loadbalancers) do
|
33
|
+
require File.expand_path('../list_load_balancers', __FILE__)
|
34
|
+
ListLoadBalancers
|
35
|
+
end
|
36
|
+
@subcommands.register(:monitors) do
|
37
|
+
require File.expand_path('../list_monitor_policies', __FILE__)
|
38
|
+
ListMonitorPolicies
|
39
|
+
end
|
40
|
+
@subcommands.register(:servers) do
|
41
|
+
require File.expand_path('../list_servers', __FILE__)
|
42
|
+
ListServers
|
43
|
+
end
|
44
|
+
@subcommands.register(:sizes) do
|
45
|
+
require File.expand_path('../list_sizes', __FILE__)
|
46
|
+
ListSizes
|
47
|
+
end
|
48
|
+
|
49
|
+
super(argv, env)
|
50
|
+
end
|
51
|
+
|
52
|
+
def execute
|
53
|
+
if @main_args.include?('-h') || @main_args.include?('--help')
|
54
|
+
return help
|
55
|
+
end
|
56
|
+
|
57
|
+
command_class = @subcommands.get(@sub_command.to_sym) if @sub_command
|
58
|
+
return help if !command_class || !@sub_command
|
59
|
+
|
60
|
+
# Initialize and execute the command class
|
61
|
+
command_class.new(@sub_args, @env).execute
|
62
|
+
end
|
63
|
+
|
64
|
+
def help
|
65
|
+
opts = OptionParser.new do |o|
|
66
|
+
o.banner = 'Usage: vagrant oneandone <subcommand> [<api_key>]'
|
67
|
+
o.separator ''
|
68
|
+
o.separator I18n.t('vagrant_1and1.command.available_subcommands')
|
69
|
+
|
70
|
+
keys = []
|
71
|
+
@subcommands.each { |key| keys << key.to_s }
|
72
|
+
|
73
|
+
keys.sort.each { |key| o.separator " #{key}" }
|
74
|
+
|
75
|
+
o.separator ''
|
76
|
+
o.separator I18n.t('vagrant_1and1.command.help_subcommands') +
|
77
|
+
' `vagrant oneandone <subcommand> -h`'
|
78
|
+
end
|
79
|
+
|
80
|
+
@env.ui.info(opts.help)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'fog-oneandone'
|
2
|
+
require 'terminal-table'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module OneAndOne
|
6
|
+
module Command
|
7
|
+
module Utils
|
8
|
+
def fog_oneandone(token)
|
9
|
+
api_key = token ? token : ENV['ONEANDONE_API_KEY']
|
10
|
+
|
11
|
+
raise Errors::NoApiKeyError unless api_key
|
12
|
+
|
13
|
+
params = {
|
14
|
+
oneandone_api_key: api_key
|
15
|
+
}
|
16
|
+
|
17
|
+
Fog::Compute::OneAndOne.new params
|
18
|
+
end
|
19
|
+
|
20
|
+
def display_table(env, headers, rows)
|
21
|
+
table = Terminal::Table.new headings: headers, rows: rows
|
22
|
+
if env.respond_to?('ui')
|
23
|
+
env.ui.info(table.to_s)
|
24
|
+
else
|
25
|
+
env[:ui].info(table.to_s)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OneAndOne
|
5
|
+
class Config < Vagrant.plugin('2', :config)
|
6
|
+
attr_accessor :api_key
|
7
|
+
attr_accessor :name
|
8
|
+
attr_accessor :description
|
9
|
+
attr_accessor :fixed_size
|
10
|
+
attr_accessor :datacenter
|
11
|
+
attr_accessor :appliance
|
12
|
+
attr_accessor :password
|
13
|
+
attr_accessor :firewall_id
|
14
|
+
attr_accessor :ip
|
15
|
+
attr_accessor :load_balancer_id
|
16
|
+
attr_accessor :monitoring_policy_id
|
17
|
+
attr_accessor :timeout
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@api_key = UNSET_VALUE
|
21
|
+
@name = UNSET_VALUE
|
22
|
+
@description = UNSET_VALUE
|
23
|
+
@fixed_size = UNSET_VALUE
|
24
|
+
@datacenter = UNSET_VALUE
|
25
|
+
@appliance = UNSET_VALUE
|
26
|
+
@password = UNSET_VALUE
|
27
|
+
@firewall_id = UNSET_VALUE
|
28
|
+
@ip = UNSET_VALUE
|
29
|
+
@load_balancer_id = UNSET_VALUE
|
30
|
+
@monitoring_policy_id = UNSET_VALUE
|
31
|
+
@timeout = UNSET_VALUE
|
32
|
+
end
|
33
|
+
|
34
|
+
def finalize!
|
35
|
+
@api_key = ENV['ONEANDONE_API_KEY'] if @api_key == UNSET_VALUE
|
36
|
+
@name = nil if @name == UNSET_VALUE
|
37
|
+
@password = nil if @password == UNSET_VALUE
|
38
|
+
@appliance = 'ubuntu1404-64std' if @appliance == UNSET_VALUE
|
39
|
+
@datacenter = 'US' if @datacenter == UNSET_VALUE
|
40
|
+
@fixed_size = 'M' if @fixed_size == UNSET_VALUE
|
41
|
+
@timeout = nil if @timeout == UNSET_VALUE
|
42
|
+
@ip = nil if @ip == UNSET_VALUE
|
43
|
+
@firewall_id = nil if @firewall_id == UNSET_VALUE
|
44
|
+
@load_balancer_id = nil if @load_balancer_id == UNSET_VALUE
|
45
|
+
@monitoring_policy_id = nil if @monitoring_policy_id == UNSET_VALUE
|
46
|
+
@description = nil if @description == UNSET_VALUE
|
47
|
+
end
|
48
|
+
|
49
|
+
def validate(machine)
|
50
|
+
errors = []
|
51
|
+
errors << I18n.t('vagrant_1and1.config.api_key_required') unless @api_key
|
52
|
+
|
53
|
+
key = machine.config.ssh.private_key_path
|
54
|
+
key = key[0] if key.is_a?(Array)
|
55
|
+
if !key
|
56
|
+
errors << I18n.t('vagrant_1and1.config.private_key')
|
57
|
+
elsif !File.file?(File.expand_path("#{key}.pub", machine.env.root_path))
|
58
|
+
errors << I18n.t('vagrant_1and1.config.public_key', key: "#{key}.pub")
|
59
|
+
end
|
60
|
+
|
61
|
+
{ 'OneAndOne Provider' => errors }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module OneAndOne
|
3
|
+
class ConfigResolver
|
4
|
+
def initialize(env)
|
5
|
+
@logger = Log4r::Logger.new('vagrant_1and1::action::config_resolver')
|
6
|
+
@compute = env[:oneandone_compute]
|
7
|
+
@provider_config = env[:machine].provider_config
|
8
|
+
end
|
9
|
+
|
10
|
+
def resolve_fixed_instance_size(env)
|
11
|
+
@logger.info 'Obtaining fixed-instance list'
|
12
|
+
|
13
|
+
env[:ui].info(I18n.t('vagrant_1and1.finding_fixed_instance_size'))
|
14
|
+
|
15
|
+
sizes = @compute.list_fixed_servers
|
16
|
+
|
17
|
+
@logger.info "Finding size matching '#{@provider_config.fixed_size}'"
|
18
|
+
|
19
|
+
size = find_matching(sizes.body, %w(id name), @provider_config.fixed_size)
|
20
|
+
|
21
|
+
raise Errors::NoMatchingFixedSizeError unless size
|
22
|
+
size['id']
|
23
|
+
end
|
24
|
+
|
25
|
+
def resolve_appliance(env)
|
26
|
+
@logger.info 'Obtaining server appliances'
|
27
|
+
|
28
|
+
env[:ui].info(I18n.t('vagrant_1and1.finding_appliance'))
|
29
|
+
|
30
|
+
appliances = @compute.list_server_appliances(q: @provider_config.appliance)
|
31
|
+
|
32
|
+
@logger.info "Finding server appliance matching '#{@provider_config.appliance}'"
|
33
|
+
|
34
|
+
app = find_matching(appliances.body, %w(id name), @provider_config.appliance)
|
35
|
+
|
36
|
+
raise Errors::NoMatchingApplianceError unless app
|
37
|
+
raise Errors::UnsupportedApplianceError if 'linux'.casecmp(app['os_family']) != 0
|
38
|
+
app['id']
|
39
|
+
end
|
40
|
+
|
41
|
+
def resolve_datacenter(env)
|
42
|
+
@logger.info 'Obtaining data centers'
|
43
|
+
|
44
|
+
env[:ui].info(I18n.t('vagrant_1and1.finding_datacenter'))
|
45
|
+
|
46
|
+
datacenters = @compute.list_datacenters
|
47
|
+
|
48
|
+
@logger.info "Finding data center matching '#{@provider_config.datacenter}'"
|
49
|
+
|
50
|
+
dc = find_matching(datacenters.body, %w(id country_code), @provider_config.datacenter)
|
51
|
+
|
52
|
+
raise Errors::NoMatchingDataCenterError unless dc
|
53
|
+
dc['id']
|
54
|
+
end
|
55
|
+
|
56
|
+
def resolve_public_ip(env)
|
57
|
+
# do nothing unless IP is set
|
58
|
+
if @provider_config.ip
|
59
|
+
@logger.info 'Obtaining public IPs'
|
60
|
+
|
61
|
+
env[:ui].info(I18n.t('vagrant_1and1.finding_public_ip'))
|
62
|
+
|
63
|
+
public_ips = @compute.list_public_ips
|
64
|
+
|
65
|
+
@logger.info "Finding public IP matching '#{@provider_config.ip}'"
|
66
|
+
|
67
|
+
ip = find_matching(public_ips.body, %w(id ip), @provider_config.ip)
|
68
|
+
|
69
|
+
raise Errors::NoMatchingPublicIPAddressError unless ip
|
70
|
+
|
71
|
+
raise Errors::IPAddressInUseError if ip['assigned_to']
|
72
|
+
|
73
|
+
ip['id']
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def resolve_ssh_key(env)
|
78
|
+
private_key = env[:machine].config.ssh.private_key_path
|
79
|
+
private_key = private_key[0] if private_key.is_a?(Array)
|
80
|
+
private_key = File.expand_path(private_key, env[:machine].env.root_path)
|
81
|
+
OneAndOne.public_key(private_key)
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def find_matching(collection, keys, value)
|
87
|
+
collection.each do |item|
|
88
|
+
keys.each do |key|
|
89
|
+
return item if value.casecmp(item[key]) == 0
|
90
|
+
end
|
91
|
+
end
|
92
|
+
@logger.error "No item key '#{value}' found in collection #{collection}"
|
93
|
+
nil
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module OneAndOne
|
3
|
+
module Errors
|
4
|
+
class OneAndOneError < Vagrant::Errors::VagrantError
|
5
|
+
error_namespace('vagrant_1and1.errors')
|
6
|
+
end
|
7
|
+
|
8
|
+
class IPAddressInUseError < OneAndOneError
|
9
|
+
error_key(:ip_address_already_in_use)
|
10
|
+
end
|
11
|
+
|
12
|
+
class NoApiKeyError < OneAndOneError
|
13
|
+
error_key(:missing_api_key)
|
14
|
+
end
|
15
|
+
|
16
|
+
class NoMatchingFixedSizeError < OneAndOneError
|
17
|
+
error_key(:no_matching_fixed_size)
|
18
|
+
end
|
19
|
+
|
20
|
+
class NoMatchingApplianceError < OneAndOneError
|
21
|
+
error_key(:no_matching_appliance)
|
22
|
+
end
|
23
|
+
|
24
|
+
class NoMatchingDataCenterError < OneAndOneError
|
25
|
+
error_key(:no_matching_datacenter)
|
26
|
+
end
|
27
|
+
|
28
|
+
class NoMatchingPublicIPAddressError < OneAndOneError
|
29
|
+
error_key(:no_matching_public_ip)
|
30
|
+
end
|
31
|
+
|
32
|
+
class PublicKeyError < OneAndOneError
|
33
|
+
error_key(:ssh_key_not_found)
|
34
|
+
end
|
35
|
+
|
36
|
+
class RsyncError < OneAndOneError
|
37
|
+
error_key(:rsync)
|
38
|
+
end
|
39
|
+
|
40
|
+
class UnsupportedApplianceError < OneAndOneError
|
41
|
+
error_key(:unsupported_appliance)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|