vagrant-cosmic 0.1.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 +17 -0
- data/CHANGELOG.md +8 -0
- data/Docker/.dockerignore +2 -0
- data/Docker/Dockerfile +48 -0
- data/Docker/Dockerfile.chefdk_0_17 +49 -0
- data/Docker/Dockerfile.latest_dependencies +49 -0
- data/Docker/README.md +95 -0
- data/Docker/vac.ps1 +29 -0
- data/Docker/vac.sh +30 -0
- data/Gemfile +21 -0
- data/Gemfile.lock +187 -0
- data/LICENSE +8 -0
- data/README.md +409 -0
- data/Rakefile +106 -0
- data/build_rpm.sh +7 -0
- data/functional-tests/basic/Vagrantfile.basic_networking +34 -0
- data/functional-tests/basic/basic_spec.rb +15 -0
- data/functional-tests/networking/Vagrantfile.advanced_networking +106 -0
- data/functional-tests/networking/networking_spec.rb +14 -0
- data/functional-tests/rsync/Vagrantfile.advanced_networking +40 -0
- data/functional-tests/rsync/rsync_spec.rb +9 -0
- data/functional-tests/vmlifecycle/Vagrantfile.advanced_networking +64 -0
- data/functional-tests/vmlifecycle/vmlifecycle_spec.rb +25 -0
- data/lib/vagrant-cosmic/action/connect_cosmic.rb +47 -0
- data/lib/vagrant-cosmic/action/is_created.rb +18 -0
- data/lib/vagrant-cosmic/action/is_stopped.rb +18 -0
- data/lib/vagrant-cosmic/action/message_already_created.rb +16 -0
- data/lib/vagrant-cosmic/action/message_not_created.rb +16 -0
- data/lib/vagrant-cosmic/action/message_will_not_destroy.rb +16 -0
- data/lib/vagrant-cosmic/action/read_rdp_info.rb +42 -0
- data/lib/vagrant-cosmic/action/read_ssh_info.rb +70 -0
- data/lib/vagrant-cosmic/action/read_state.rb +38 -0
- data/lib/vagrant-cosmic/action/read_transport_info.rb +59 -0
- data/lib/vagrant-cosmic/action/read_winrm_info.rb +69 -0
- data/lib/vagrant-cosmic/action/run_instance.rb +819 -0
- data/lib/vagrant-cosmic/action/start_instance.rb +81 -0
- data/lib/vagrant-cosmic/action/stop_instance.rb +28 -0
- data/lib/vagrant-cosmic/action/terminate_instance.rb +208 -0
- data/lib/vagrant-cosmic/action/timed_provision.rb +21 -0
- data/lib/vagrant-cosmic/action/wait_for_state.rb +41 -0
- data/lib/vagrant-cosmic/action/warn_networks.rb +19 -0
- data/lib/vagrant-cosmic/action.rb +210 -0
- data/lib/vagrant-cosmic/capabilities/rdp.rb +12 -0
- data/lib/vagrant-cosmic/capabilities/winrm.rb +12 -0
- data/lib/vagrant-cosmic/config.rb +422 -0
- data/lib/vagrant-cosmic/errors.rb +27 -0
- data/lib/vagrant-cosmic/exceptions/exceptions.rb +15 -0
- data/lib/vagrant-cosmic/model/cosmic_resource.rb +51 -0
- data/lib/vagrant-cosmic/plugin.rb +82 -0
- data/lib/vagrant-cosmic/provider.rb +58 -0
- data/lib/vagrant-cosmic/service/cosmic_resource_service.rb +76 -0
- data/lib/vagrant-cosmic/util/timer.rb +17 -0
- data/lib/vagrant-cosmic/version.rb +5 -0
- data/lib/vagrant-cosmic.rb +17 -0
- data/locales/en.yml +131 -0
- data/spec/spec_helper.rb +53 -0
- data/spec/vagrant-cosmic/action/read_ssh_info_spec.rb +80 -0
- data/spec/vagrant-cosmic/action/retrieve_public_ip_port_spec.rb +94 -0
- data/spec/vagrant-cosmic/action/run_instance_spec.rb +573 -0
- data/spec/vagrant-cosmic/action/terminate_instance_spec.rb +207 -0
- data/spec/vagrant-cosmic/config_spec.rb +340 -0
- data/spec/vagrant-cosmic/model/cosmic_resource_spec.rb +95 -0
- data/spec/vagrant-cosmic/service/cosmic_resource_service_spec.rb +43 -0
- data/spec/vagrant-cosmic/support/be_a_resource.rb +6 -0
- data/vagrant-cosmic.gemspec +59 -0
- data/vagrant-cosmic.spec +42 -0
- metadata +218 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
describe 'Networking features' do
|
2
|
+
it 'creates firewall and portwarding rules for both Virtual Router and VPC' do
|
3
|
+
expect(`vagrant up`).to include(
|
4
|
+
'VRbox1: Machine is booted and ready for use!',
|
5
|
+
'VRbox2: Machine is booted and ready for use!',
|
6
|
+
'VPCbox1: Machine is booted and ready for use!',
|
7
|
+
'VPCbox2: Machine is booted and ready for use!'
|
8
|
+
)
|
9
|
+
expect($?.exitstatus).to eq(0)
|
10
|
+
|
11
|
+
expect(`vagrant destroy --force`).to include('Terminating the instance...')
|
12
|
+
expect($?.exitstatus).to eq(0)
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
|
5
|
+
VAGRANTFILE_API_VERSION = '2'
|
6
|
+
|
7
|
+
Vagrant.require_version '>= 1.5.0'
|
8
|
+
|
9
|
+
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
10
|
+
config.vm.box = ENV['LINUX_TEMPLATE_NAME']
|
11
|
+
|
12
|
+
config.vm.synced_folder ".", "/vagrant", type: "rsync",
|
13
|
+
rsync__exclude: [".git/", "vendor"]
|
14
|
+
|
15
|
+
config.vm.provider :cosmic do |cosmic, override|
|
16
|
+
cosmic.display_name = ENV['TEST_NAME']
|
17
|
+
|
18
|
+
cosmic.host = ENV['COSMIC_HOST']
|
19
|
+
cosmic.path = '/client/api'
|
20
|
+
cosmic.port = '443'
|
21
|
+
cosmic.scheme = 'https'
|
22
|
+
cosmic.api_key = ENV['COSMIC_API_KEY']
|
23
|
+
cosmic.secret_key = ENV['COSMIC_SECRET_KEY']
|
24
|
+
cosmic.expunge_on_destroy = ENV['EXPUNGE_ON_DESTROY']=="true"
|
25
|
+
|
26
|
+
cosmic.zone_name = ENV['ZONE_NAME']
|
27
|
+
cosmic.network_name = ENV['NETWORK_NAME']
|
28
|
+
cosmic.service_offering_name = ENV['SERVICE_OFFERING_NAME']
|
29
|
+
|
30
|
+
cosmic.pf_ip_address = ENV['PUBLIC_SOURCE_NAT_IP']
|
31
|
+
cosmic.pf_trusted_networks = ENV['SOURCE_CIDR']
|
32
|
+
cosmic.pf_open_firewall = false
|
33
|
+
|
34
|
+
unless ENV['SSH_KEY'].nil?
|
35
|
+
cosmic.ssh_key = ENV['SSH_KEY']
|
36
|
+
cosmic.ssh_user = ENV['SSH_USER']
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
describe 'VM RSync' do
|
2
|
+
it 'does rsync to the VM' do
|
3
|
+
expect(`vagrant up`).to include('Machine is booted and ready for use!')
|
4
|
+
expect($?.exitstatus).to eq(0)
|
5
|
+
expect(`vagrant ssh -c "ls /vagrant; echo;"`).to include('Vagrantfile.advanced_networking')
|
6
|
+
expect(`vagrant destroy --force`).to include('Terminating the instance...')
|
7
|
+
expect($?.exitstatus).to eq(0)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
|
5
|
+
VAGRANTFILE_API_VERSION = '2'
|
6
|
+
|
7
|
+
Vagrant.require_version '>= 1.5.0'
|
8
|
+
|
9
|
+
machines = {
|
10
|
+
'linux-box' => {
|
11
|
+
'template' => ENV['LINUX_TEMPLATE_NAME'],
|
12
|
+
'communicator' => 'ssh',
|
13
|
+
'rsync_disabled' => true
|
14
|
+
},
|
15
|
+
'windows-box' => {
|
16
|
+
'template' => ENV['WINDOWS_TEMPLATE_NAME'],
|
17
|
+
'communicator' => 'winrm',
|
18
|
+
'rsync_disabled' => true
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
|
23
|
+
Vagrant.configure(VAGRANTFILE_API_VERSION) do |global_config|
|
24
|
+
machines.each_pair do |name, options|
|
25
|
+
global_config.vm.define name do |config|
|
26
|
+
config.vm.box = options['template']
|
27
|
+
|
28
|
+
config.vm.communicator = options['communicator']
|
29
|
+
config.winrm.retry_delay = 30
|
30
|
+
config.vm.synced_folder ".", "/vagrant", type: "rsync",
|
31
|
+
rsync__exclude: [".git/", "vendor"], disabled: options['rsync_disabled']
|
32
|
+
config.vm.provider :cosmic do |cosmic, override|
|
33
|
+
|
34
|
+
cosmic.display_name = ENV['TEST_NAME']
|
35
|
+
|
36
|
+
cosmic.host = ENV['COSMIC_HOST']
|
37
|
+
cosmic.path = '/client/api'
|
38
|
+
cosmic.port = '443'
|
39
|
+
cosmic.scheme = 'https'
|
40
|
+
cosmic.api_key = ENV['COSMIC_API_KEY']
|
41
|
+
cosmic.secret_key = ENV['COSMIC_SECRET_KEY']
|
42
|
+
cosmic.expunge_on_destroy = ENV['EXPUNGE_ON_DESTROY']=="true"
|
43
|
+
|
44
|
+
cosmic.zone_name = ENV['ZONE_NAME']
|
45
|
+
cosmic.network_name = ENV['NETWORK_NAME']
|
46
|
+
cosmic.service_offering_name = ENV['SERVICE_OFFERING_NAME']
|
47
|
+
cosmic.disk_offering_name = ENV['DISK_OFFERING_NAME']
|
48
|
+
|
49
|
+
cosmic.pf_ip_address = ENV['PUBLIC_SOURCE_NAT_IP']
|
50
|
+
|
51
|
+
cosmic.pf_public_port = options['public_port']
|
52
|
+
cosmic.pf_private_port = options['private_port']
|
53
|
+
cosmic.pf_trusted_networks = ENV['SOURCE_CIDR']
|
54
|
+
cosmic.pf_open_firewall = false
|
55
|
+
|
56
|
+
|
57
|
+
cosmic.ssh_key = ENV['SSH_KEY'] unless ENV['SSH_KEY'].nil?
|
58
|
+
cosmic.ssh_user = ENV['SSH_USER'] unless ENV['SSH_USER'].nil?
|
59
|
+
cosmic.vm_user = ENV['WINDOWS_USER'] unless ENV['WINDOWS_USER'].nil?
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
def which(cmd)
|
2
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
3
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
4
|
+
exts.each { |ext|
|
5
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
6
|
+
return exe if File.executable?(exe) && !File.directory?(exe)
|
7
|
+
}
|
8
|
+
end
|
9
|
+
return nil
|
10
|
+
end
|
11
|
+
insert_tee_log = ' 2>&1 | tee -a vagrant.log ' if which('tee')
|
12
|
+
|
13
|
+
describe 'VM Life Cycle' do
|
14
|
+
it 'starts Linux and Windows VM' do
|
15
|
+
expect(`vagrant up #{insert_tee_log}`).to include(
|
16
|
+
'linux-box: Machine is booted and ready for use!',
|
17
|
+
'windows-box: Machine is booted and ready for use!'
|
18
|
+
)
|
19
|
+
expect($?.exitstatus).to eq(0)
|
20
|
+
end
|
21
|
+
it 'destroys Linux and Windows VM' do
|
22
|
+
expect(`vagrant destroy --force #{insert_tee_log}`).to include('Done removing resources')
|
23
|
+
expect($?.exitstatus).to eq(0)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'fog/cosmic'
|
2
|
+
require 'log4r'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Cosmic
|
6
|
+
module Action
|
7
|
+
# This action connects to Cosmic, verifies credentials work, and
|
8
|
+
# puts the Cosmic connection object into the
|
9
|
+
# `:cosmic_compute` key in the environment.
|
10
|
+
class ConnectCosmic
|
11
|
+
def initialize(app, env)
|
12
|
+
@app = app
|
13
|
+
@logger = Log4r::Logger.new('vagrant_cosmic::action::connect_cosmic')
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(env)
|
17
|
+
# Get the domain we're going to booting up in
|
18
|
+
domain = env[:machine].provider_config.domain_id
|
19
|
+
|
20
|
+
# Get the configs
|
21
|
+
domain_config = env[:machine].provider_config.get_domain_config(domain)
|
22
|
+
|
23
|
+
# Build the fog config
|
24
|
+
fog_config = {
|
25
|
+
:provider => :cosmic
|
26
|
+
#:domain => domain_config
|
27
|
+
}
|
28
|
+
|
29
|
+
if domain_config.api_key
|
30
|
+
fog_config[:cosmic_api_key] = domain_config.api_key
|
31
|
+
fog_config[:cosmic_secret_access_key] = domain_config.secret_key
|
32
|
+
end
|
33
|
+
|
34
|
+
fog_config[:cosmic_host] = domain_config.host if domain_config.host
|
35
|
+
fog_config[:cosmic_path] = domain_config.path if domain_config.path
|
36
|
+
fog_config[:cosmic_port] = domain_config.port if domain_config.port
|
37
|
+
fog_config[:cosmic_scheme] = domain_config.scheme if domain_config.scheme
|
38
|
+
|
39
|
+
@logger.info('Connecting to Cosmic...')
|
40
|
+
env[:cosmic_compute] = Fog::Compute.new(fog_config)
|
41
|
+
|
42
|
+
@app.call(env)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Cosmic
|
3
|
+
module Action
|
4
|
+
# This can be used with "Call" built-in to check if the machine
|
5
|
+
# is created and branch in the middleware.
|
6
|
+
class IsCreated
|
7
|
+
def initialize(app, env)
|
8
|
+
@app = app
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
env[:result] = env[:machine].state.id != :not_created
|
13
|
+
@app.call(env)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Cosmic
|
3
|
+
module Action
|
4
|
+
# This can be used with "Call" built-in to check if the machine
|
5
|
+
# is stopped and branch in the middleware.
|
6
|
+
class IsStopped
|
7
|
+
def initialize(app, env)
|
8
|
+
@app = app
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
env[:result] = env[:machine].state.id == :stopped
|
13
|
+
@app.call(env)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Cosmic
|
3
|
+
module Action
|
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_cosmic.already_status", :status => "created"))
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Cosmic
|
3
|
+
module Action
|
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_cosmic.not_created"))
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Cosmic
|
3
|
+
module Action
|
4
|
+
class MessageWillNotDestroy
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
env[:ui].info(I18n.t("vagrant_cosmic.will_not_destroy", name: env[:machine].name))
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative 'read_transport_info.rb'
|
2
|
+
require 'log4r'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Cosmic
|
6
|
+
module Action
|
7
|
+
# This action reads the WinRM info for the machine and puts it into the
|
8
|
+
# `:machine_winrm_info` key in the environment.
|
9
|
+
class ReadRdpInfo < ReadTransportInfo
|
10
|
+
def initialize(app, env)
|
11
|
+
@app = app
|
12
|
+
@logger = Log4r::Logger.new("vagrant_cosmic::action::read_rdp_info")
|
13
|
+
|
14
|
+
@public_port_fieldname = 'pf_public_rdp_port'
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
env[:machine_rdp_info] = read_rdp_info(env[:cosmic_compute], env[:machine])
|
19
|
+
|
20
|
+
@app.call(env)
|
21
|
+
end
|
22
|
+
|
23
|
+
def read_rdp_info(cosmic, machine)
|
24
|
+
return nil if (server = find_server(cosmic, machine)).nil?
|
25
|
+
|
26
|
+
# Get the Port forwarding config
|
27
|
+
domain = machine.provider_config.domain_id
|
28
|
+
domain_config = machine.provider_config.get_domain_config(domain)
|
29
|
+
|
30
|
+
pf_ip_address, pf_public_port = retrieve_public_ip_port(cosmic, domain_config, machine)
|
31
|
+
|
32
|
+
transport_info = {
|
33
|
+
:host => pf_ip_address || server.nics[0]['ipaddress'],
|
34
|
+
:port => pf_public_port
|
35
|
+
}
|
36
|
+
|
37
|
+
transport_info
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require_relative 'read_transport_info.rb'
|
2
|
+
require 'log4r'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Cosmic
|
6
|
+
module Action
|
7
|
+
# This action reads the SSH info for the machine and puts it into the
|
8
|
+
# `:machine_ssh_info` key in the environment.
|
9
|
+
class ReadSSHInfo < ReadTransportInfo
|
10
|
+
def initialize(app, env)
|
11
|
+
@app = app
|
12
|
+
@logger = Log4r::Logger.new("vagrant_cosmic::action::read_ssh_info")
|
13
|
+
|
14
|
+
@public_port_fieldname = 'pf_public_port'
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
env[:machine_ssh_info] = read_ssh_info(env[:cosmic_compute], env[:machine])
|
19
|
+
|
20
|
+
@app.call(env)
|
21
|
+
end
|
22
|
+
|
23
|
+
def read_ssh_info(cosmic, machine)
|
24
|
+
return nil if (server = find_server(cosmic, machine)).nil?
|
25
|
+
|
26
|
+
# Get the Port forwarding config
|
27
|
+
domain = machine.provider_config.domain_id
|
28
|
+
domain_config = machine.provider_config.get_domain_config(domain)
|
29
|
+
|
30
|
+
pf_ip_address, pf_public_port = retrieve_public_ip_port(cosmic, domain_config, machine)
|
31
|
+
|
32
|
+
if domain_config.keypair.nil? && domain_config.ssh_key.nil?
|
33
|
+
sshkeyfile_file = machine.data_dir.join('sshkeyfile')
|
34
|
+
if sshkeyfile_file.file?
|
35
|
+
domain_config.ssh_key = sshkeyfile_file.to_s
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
nic_ip_address = fetch_nic_ip_address(server.nics, domain_config)
|
40
|
+
|
41
|
+
transport_info = {
|
42
|
+
:host => pf_ip_address || nic_ip_address,
|
43
|
+
:port => pf_public_port
|
44
|
+
}
|
45
|
+
transport_info = transport_info.merge({
|
46
|
+
:private_key_path => domain_config.ssh_key,
|
47
|
+
:password => nil
|
48
|
+
}) unless domain_config.ssh_key.nil?
|
49
|
+
transport_info = transport_info.merge({ :username => domain_config.ssh_user }) unless domain_config.ssh_user.nil?
|
50
|
+
transport_info
|
51
|
+
end
|
52
|
+
|
53
|
+
def fetch_nic_ip_address(nics, domain_config)
|
54
|
+
ssh_nic =
|
55
|
+
if !domain_config.ssh_network_id.nil?
|
56
|
+
nics.find { |nic| nic["networkid"] == domain_config.ssh_network_id }
|
57
|
+
elsif !domain_config.ssh_network_name.nil?
|
58
|
+
nics.find { |nic| nic["networkname"] == domain_config.ssh_network_name }
|
59
|
+
else
|
60
|
+
# When without neither ssh_network_id and ssh_network_name, use 1st nic
|
61
|
+
nics[0]
|
62
|
+
end
|
63
|
+
|
64
|
+
ssh_nic ||= nics[0]
|
65
|
+
ssh_nic["ipaddress"]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Cosmic
|
5
|
+
module Action
|
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_cosmic::action::read_state")
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
env[:machine_state_id] = read_state(env[:cosmic_compute], env[:machine])
|
16
|
+
|
17
|
+
@app.call(env)
|
18
|
+
end
|
19
|
+
|
20
|
+
def read_state(cosmic, machine)
|
21
|
+
return :not_created if machine.id.nil?
|
22
|
+
|
23
|
+
# Find the machine
|
24
|
+
server = cosmic.servers.get(machine.id)
|
25
|
+
if server.nil? || [:"shutting-down", :terminated].include?(server.state.downcase.to_sym)
|
26
|
+
# The machine can't be found
|
27
|
+
@logger.info("Machine not found or terminated, assuming it got destroyed.")
|
28
|
+
machine.id = nil
|
29
|
+
return :not_created
|
30
|
+
end
|
31
|
+
|
32
|
+
# Return the state
|
33
|
+
server.state.downcase.to_sym
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Cosmic
|
3
|
+
module Action
|
4
|
+
class ReadTransportInfo
|
5
|
+
def initialize
|
6
|
+
@public_port_fieldname = 'pf_public_port'
|
7
|
+
end
|
8
|
+
|
9
|
+
def retrieve_public_ip_port(cosmic, domain_config, machine)
|
10
|
+
pf_ip_address_id = domain_config.pf_ip_address_id
|
11
|
+
pf_ip_address = domain_config.pf_ip_address
|
12
|
+
pf_public_port = domain_config.send(@public_port_fieldname)
|
13
|
+
|
14
|
+
if pf_public_port.nil?
|
15
|
+
pf_public_port_file = machine.data_dir.join(@public_port_fieldname)
|
16
|
+
if pf_public_port_file.file?
|
17
|
+
File.read(pf_public_port_file).each_line do |line|
|
18
|
+
pf_public_port = line.strip
|
19
|
+
end
|
20
|
+
domain_config.send("#{@public_port_fieldname}=", pf_public_port)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
if not pf_ip_address and pf_ip_address_id and pf_public_port
|
25
|
+
begin
|
26
|
+
response = cosmic.list_public_ip_addresses({:id => pf_ip_address_id})
|
27
|
+
rescue Fog::Cosmic::Compute::Error => e
|
28
|
+
raise Errors::FogError, :message => e.message
|
29
|
+
end
|
30
|
+
|
31
|
+
if (response['listpublicipaddressesresponse']['count']).zero?
|
32
|
+
@logger.info("IP address #{pf_ip_address_id} not exists.")
|
33
|
+
env[:ui].info(I18n.t("IP address #{pf_ip_address_id} not exists."))
|
34
|
+
pf_ip_address = nil
|
35
|
+
else
|
36
|
+
pf_ip_address = response['listpublicipaddressesresponse']['publicipaddress'][0]['ipaddress']
|
37
|
+
end
|
38
|
+
end
|
39
|
+
return pf_ip_address, pf_public_port
|
40
|
+
end
|
41
|
+
|
42
|
+
def find_server(cosmic, machine)
|
43
|
+
return nil if machine.id.nil?
|
44
|
+
|
45
|
+
# Find the machine
|
46
|
+
server = cosmic.servers.get(machine.id)
|
47
|
+
if server.nil? || [:"shutting-down", :terminated].include?(server.state.downcase.to_sym)
|
48
|
+
# The machine can't be found
|
49
|
+
@logger.info("Machine couldn't be found, assuming it got destroyed.")
|
50
|
+
machine.id = nil
|
51
|
+
return nil
|
52
|
+
end
|
53
|
+
|
54
|
+
server
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require_relative 'read_transport_info.rb'
|
2
|
+
require 'log4r'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Cosmic
|
6
|
+
module Action
|
7
|
+
# This action reads the WinRM info for the machine and puts it into the
|
8
|
+
# `:machine_winrm_info` key in the environment.
|
9
|
+
class ReadWinrmInfo < ReadTransportInfo
|
10
|
+
def initialize(app, env)
|
11
|
+
@app = app
|
12
|
+
@logger = Log4r::Logger.new("vagrant_cosmic::action::read_winrm_info")
|
13
|
+
|
14
|
+
@public_port_fieldname = 'pf_public_port'
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
env[:machine_winrm_info] = read_winrm_info(env[:cosmic_compute], env[:machine])
|
19
|
+
|
20
|
+
@app.call(env)
|
21
|
+
end
|
22
|
+
|
23
|
+
def read_winrm_info(cosmic, machine)
|
24
|
+
return nil if (server = find_server(cosmic, machine)).nil?
|
25
|
+
|
26
|
+
# Get the Port forwarding config
|
27
|
+
domain = machine.provider_config.domain_id
|
28
|
+
domain_config = machine.provider_config.get_domain_config(domain)
|
29
|
+
|
30
|
+
pf_ip_address, pf_public_port = retrieve_public_ip_port(cosmic, domain_config, machine)
|
31
|
+
|
32
|
+
|
33
|
+
transport_info = {
|
34
|
+
:host => pf_ip_address || server.nics[0]['ipaddress'],
|
35
|
+
:port => pf_public_port
|
36
|
+
}
|
37
|
+
|
38
|
+
transport_info = transport_info.merge({
|
39
|
+
:username => domain_config.vm_user
|
40
|
+
}) unless domain_config.vm_user.nil?
|
41
|
+
machine.config.winrm.username = domain_config.vm_user unless domain_config.vm_user.nil?
|
42
|
+
# The WinRM communicator doesnt support passing
|
43
|
+
# the username via winrm_info ... yet ;-)
|
44
|
+
|
45
|
+
# Read password from file into domain_config
|
46
|
+
if domain_config.vm_password.nil?
|
47
|
+
vmcredentials_file = machine.data_dir.join("vmcredentials")
|
48
|
+
if vmcredentials_file.file?
|
49
|
+
vmcredentials_password = nil
|
50
|
+
File.read(vmcredentials_file).each_line do |line|
|
51
|
+
vmcredentials_password = line.strip
|
52
|
+
end
|
53
|
+
domain_config.vm_password = vmcredentials_password
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
transport_info = transport_info.merge({
|
58
|
+
:password => domain_config.vm_password
|
59
|
+
}) unless domain_config.vm_password.nil?
|
60
|
+
# The WinRM communicator doesnt support passing
|
61
|
+
# the password via winrm_info ... yet ;-)
|
62
|
+
machine.config.winrm.password = domain_config.vm_password unless domain_config.vm_password.nil?
|
63
|
+
|
64
|
+
transport_info
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|