[DRE-commits] [vagrant-libvirt] 10/104: - Changed way how to get IP address of new VM - checks /var/lib/libvirt/dnsmasq/*.leases files.
Antonio Terceiro
terceiro at moszumanska.debian.org
Sun Apr 24 13:55:39 UTC 2016
This is an automated email from the git hooks/post-receive script.
terceiro pushed a commit to annotated tag 0.0.11
in repository vagrant-libvirt.
commit 99d649a2c39dedf309bb0522742a5c7e509e15ee
Author: pradels <les.pradels at gmail.com>
Date: Mon Apr 1 02:17:05 2013 +0200
- Changed way how to get IP address of new VM - checks
/var/lib/libvirt/dnsmasq/*.leases files.
- IP address is saved in $data_dir/ip file for future.
This IP is then checked if it match with VMs MAC address.
- Added ssh, provision and resume subcommand
---
Rakefile | 6 +-
lib/vagrant-libvirt/action.rb | 88 ++++++++++++++++++----
lib/vagrant-libvirt/action/connect_libvirt.rb | 8 +-
lib/vagrant-libvirt/action/create_domain.rb | 1 +
lib/vagrant-libvirt/action/destroy_domain.rb | 10 ++-
lib/vagrant-libvirt/action/read_ssh_info.rb | 54 ++++++++++---
.../action/{destroy_domain.rb => resume_domain.rb} | 17 ++---
.../action/{suspend.rb => suspend_domain.rb} | 17 +++--
lib/vagrant-libvirt/action/wait_till_up.rb | 7 ++
lib/vagrant-libvirt/errors.rb | 9 +++
locales/en.yml | 28 ++++---
11 files changed, 182 insertions(+), 63 deletions(-)
diff --git a/Rakefile b/Rakefile
index b41e6e1..dcde899 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,7 +1,7 @@
#!/usr/bin/env rake
-require 'rubygems'
-require 'bundler/setup'
-#require 'bundler/gem_tasks'
+#require 'rubygems'
+#require 'bundler/setup'
+require 'bundler/gem_tasks'
Bundler::GemHelper.install_tasks
diff --git a/lib/vagrant-libvirt/action.rb b/lib/vagrant-libvirt/action.rb
index 000f1ce..9b3c01b 100644
--- a/lib/vagrant-libvirt/action.rb
+++ b/lib/vagrant-libvirt/action.rb
@@ -29,12 +29,12 @@ module VagrantPlugins
b2.use CreateDomainVolume
b2.use CreateDomain
b2.use CreateNetworkInterfaces
- end
- b.use TimedProvision
- b.use StartDomain
- b.use WaitTillUp
- b.use SyncFolders
+ b2.use TimedProvision
+ b2.use StartDomain
+ b2.use WaitTillUp
+ b2.use SyncFolders
+ end
end
end
@@ -55,6 +55,71 @@ module VagrantPlugins
end
end
+ # This action is called to SSH into the machine.
+ def self.action_ssh
+ Vagrant::Action::Builder.new.tap do |b|
+ b.use ConfigValidate
+ b.use Call, IsCreated do |env, b2|
+ if !env[:result]
+ b2.use MessageNotCreated
+ next
+ end
+
+ b2.use SSHExec
+ end
+ end
+ end
+
+ # This action is called when `vagrant provision` is called.
+ def self.action_provision
+ Vagrant::Action::Builder.new.tap do |b|
+ b.use ConfigValidate
+ b.use Call, IsCreated do |env, b2|
+ if !env[:result]
+ b2.use MessageNotCreated
+ next
+ end
+
+ b2.use Provision
+ b2.use SyncFolders
+ end
+ end
+ end
+
+ # This is the action that is primarily responsible for suspending
+ # the virtual machine.
+ def self.action_suspend
+ Vagrant::Action::Builder.new.tap do |b|
+ b.use ConfigValidate
+ b.use Call, IsCreated do |env, b2|
+ if !env[:result]
+ b2.use MessageNotCreated
+ next
+ end
+
+ b2.use ConnectLibvirt
+ b2.use SuspendDomain
+ end
+ end
+ end
+
+ # This is the action that is primarily responsible for resuming
+ # suspended machines.
+ def self.action_resume
+ Vagrant::Action::Builder.new.tap do |b|
+ b.use ConfigValidate
+ b.use Call, IsCreated do |env, b2|
+ if !env[:result]
+ b2.use MessageNotCreated
+ next
+ end
+
+ b2.use ConnectLibvirt
+ b2.use ResumeDomain
+ end
+ end
+ end
+
# This action is called to read the state of the machine. The resulting
# state is expected to be put into the `:machine_state_id` key.
def self.action_read_state
@@ -76,18 +141,7 @@ module VagrantPlugins
end
end
- # suspend
- # save vm to file
- def self.action_suspend
- Vagrant::Action::Builder.new.tap do |b|
- b.use ConfigValidate
- b.use ConnectLibvirt
- b.use Suspend
- end
- end
-
action_root = Pathname.new(File.expand_path("../action", __FILE__))
- autoload :Suspend, action_root.join("suspend")
autoload :ConnectLibvirt, action_root.join("connect_libvirt")
autoload :IsCreated, action_root.join("is_created")
autoload :MessageAlreadyCreated, action_root.join("message_already_created")
@@ -100,6 +154,8 @@ module VagrantPlugins
autoload :CreateNetworkInterfaces, action_root.join("create_network_interfaces")
autoload :DestroyDomain, action_root.join("destroy_domain")
autoload :StartDomain, action_root.join("start_domain")
+ autoload :SuspendDomain, action_root.join("suspend_domain")
+ autoload :ResumeDomain, action_root.join("resume_domain")
autoload :ReadState, action_root.join("read_state")
autoload :ReadSSHInfo, action_root.join("read_ssh_info")
autoload :TimedProvision, action_root.join("timed_provision")
diff --git a/lib/vagrant-libvirt/action/connect_libvirt.rb b/lib/vagrant-libvirt/action/connect_libvirt.rb
index 04a0f82..9ea0e64 100644
--- a/lib/vagrant-libvirt/action/connect_libvirt.rb
+++ b/lib/vagrant-libvirt/action/connect_libvirt.rb
@@ -48,11 +48,9 @@ module VagrantPlugins
conn_attr[:libvirt_password] = config.password if config.password
# Setup command for retrieving IP address for newly created machine
- # with some MAC address. Get it via arp table. This solution doesn't
- # require arpwatch to be installed.
- conn_attr[:libvirt_ip_command] = "arp -an | grep $mac | sed '"
- conn_attr[:libvirt_ip_command] << 's/.*(\([0-9\.]*\)).*/\1/'
- conn_attr[:libvirt_ip_command] << "'"
+ # with some MAC address. Get it from dnsmasq leases table.
+ conn_attr[:libvirt_ip_command] = "cat /var/lib/libvirt/dnsmasq/*.leases"
+ conn_attr[:libvirt_ip_command] << " | grep $mac | awk ' { print $3 }'"
@logger.info("Connecting to Libvirt (#{uri}) ...")
begin
diff --git a/lib/vagrant-libvirt/action/create_domain.rb b/lib/vagrant-libvirt/action/create_domain.rb
index db58ec2..584caed 100644
--- a/lib/vagrant-libvirt/action/create_domain.rb
+++ b/lib/vagrant-libvirt/action/create_domain.rb
@@ -37,6 +37,7 @@ module VagrantPlugins
env[:ui].info(" -- Cpus: #{@cpus}")
env[:ui].info(" -- Memory: #{@memory_size/1024}M")
env[:ui].info(" -- Base box: #{env[:machine].box.name}")
+ env[:ui].info(" -- Storage pool: #{env[:machine].provider_config.storage_pool_name}")
env[:ui].info(" -- Image: #{@domain_volume_path}")
# Create libvirt domain.
diff --git a/lib/vagrant-libvirt/action/destroy_domain.rb b/lib/vagrant-libvirt/action/destroy_domain.rb
index 87f0396..7e18521 100644
--- a/lib/vagrant-libvirt/action/destroy_domain.rb
+++ b/lib/vagrant-libvirt/action/destroy_domain.rb
@@ -4,24 +4,26 @@ module VagrantPlugins
module Libvirt
module Action
class DestroyDomain
-
def initialize(app, env)
@logger = Log4r::Logger.new("vagrant_libvirt::action::destroy_domain")
@app = app
end
def call(env)
-
- # Destroy the server and remove the tracking ID
+ # Destroy the server, remove the tracking ID and file holding IP
+ # address.
env[:ui].info(I18n.t("vagrant_libvirt.destroy_domain"))
domain = env[:libvirt_compute].servers.get(env[:machine].id.to_s)
domain.destroy(:destroy_volumes => true)
env[:machine].id = nil
+ # Remove file holding IP address
+ ip_file_path = env[:machine].data_dir + 'ip'
+ File.delete(ip_file_path) if File.exists?(ip_file_path)
+
@app.call(env)
end
-
end
end
end
diff --git a/lib/vagrant-libvirt/action/read_ssh_info.rb b/lib/vagrant-libvirt/action/read_ssh_info.rb
index 336ba96..907b1fb 100644
--- a/lib/vagrant-libvirt/action/read_ssh_info.rb
+++ b/lib/vagrant-libvirt/action/read_ssh_info.rb
@@ -18,23 +18,58 @@ module VagrantPlugins
@app.call(env)
end
-
- def read_ssh_info(libvirt, machine)
+ def read_ssh_info(libvirt,machine)
return nil if machine.id.nil?
# Find the machine
- server = libvirt.servers.get(machine.id)
- if server.nil?
+ domain = libvirt.servers.get(machine.id)
+ if domain.nil?
# The machine can't be found
@logger.info("Machine couldn't be found, assuming it got destroyed.")
machine.id = nil
return nil
end
- # Get ip address of machine
- ip_address = server.public_ip_address
- ip_address = server.private_ip_address if ip_address == nil
- return nil if ip_address == nil
+ # IP address of machine is stored in $data_dir/ip file. Why? Commands
+ # like ssh or provision need to get IP of VM long time after it was
+ # started and gathered IP. Record in arp table is lost, and this is
+ # the way how to store this info. Not an ideal solution, but libvirt
+ # doesn't provide way how to get IP of some domain.
+ ip_file = machine.data_dir + 'ip'
+ raise Errors::NoIpAddressError if not File.exists?(ip_file)
+ ip_address = File.open(ip_file, 'r') do |file|
+ file.read
+ end
+
+ # Check if stored IP address matches with MAC address of machine.
+ # Command is executed either localy, or on remote libvirt hypervisor,
+ # depends on establised fog libvirt connection.
+ ip_match = false
+ ip_command = "ping -c1 #{ip_address} > /dev/null && "
+ ip_command << "arp -an | grep $mac | sed '"
+ ip_command << 's/.*(\([0-9\.]*\)).*/\1/' + "'"
+ options_hash = { :ip_command => ip_command }
+ 3.times do |x|
+ break if ip_match
+ domain.wait_for(1) {
+ begin
+ addresses(service, options_hash).each_pair do |type, ip|
+ if ip[0] != nil
+ ip_match = true
+ break
+ end
+ end
+ rescue Fog::Errors::Error
+ # Sometimes, if pinging happen too quickly after after IP
+ # assignment, machine is not responding yet. Give it a little
+ # time..
+ sleep 1
+ end
+
+ break if ip_match
+ }
+ end
+ raise Errors::IpAddressMismatchError if not ip_match
# Return the info
# TODO: Some info should be configurable in Vagrantfile
@@ -43,8 +78,7 @@ module VagrantPlugins
:port => 22,
:username => 'root',
}
- end
-
+ end
end
end
end
diff --git a/lib/vagrant-libvirt/action/destroy_domain.rb b/lib/vagrant-libvirt/action/resume_domain.rb
similarity index 56%
copy from lib/vagrant-libvirt/action/destroy_domain.rb
copy to lib/vagrant-libvirt/action/resume_domain.rb
index 87f0396..280b872 100644
--- a/lib/vagrant-libvirt/action/destroy_domain.rb
+++ b/lib/vagrant-libvirt/action/resume_domain.rb
@@ -3,25 +3,24 @@ require 'log4r'
module VagrantPlugins
module Libvirt
module Action
- class DestroyDomain
-
+ # Resume suspended domain.
+ class ResumeDomain
def initialize(app, env)
- @logger = Log4r::Logger.new("vagrant_libvirt::action::destroy_domain")
+ @logger = Log4r::Logger.new("vagrant_libvirt::action::resume_domain")
@app = app
end
def call(env)
-
- # Destroy the server and remove the tracking ID
- env[:ui].info(I18n.t("vagrant_libvirt.destroy_domain"))
+ env[:ui].info(I18n.t("vagrant_libvirt.resuming_domain"))
domain = env[:libvirt_compute].servers.get(env[:machine].id.to_s)
- domain.destroy(:destroy_volumes => true)
- env[:machine].id = nil
+ raise Errors::NoDomainError if domain == nil
+
+ domain.resume
+ @logger.info("Machine #{env[:machine].id} is resumed.")
@app.call(env)
end
-
end
end
end
diff --git a/lib/vagrant-libvirt/action/suspend.rb b/lib/vagrant-libvirt/action/suspend_domain.rb
similarity index 50%
rename from lib/vagrant-libvirt/action/suspend.rb
rename to lib/vagrant-libvirt/action/suspend_domain.rb
index 4499acf..0215ee6 100644
--- a/lib/vagrant-libvirt/action/suspend.rb
+++ b/lib/vagrant-libvirt/action/suspend_domain.rb
@@ -3,23 +3,26 @@ require 'log4r'
module VagrantPlugins
module Libvirt
module Action
-
- class Suspend
+ # Suspend domain.
+ class SuspendDomain
def initialize(app, env)
- @logger = Log4r::Logger.new("vagrant_libvirt::action::create_domain")
+ @logger = Log4r::Logger.new("vagrant_libvirt::action::suspend_domain")
@app = app
end
# make pause
def call(env)
- vmid = env[:machine].id.to_s.chomp
- domain = env[:libvirt_compute].servers.get(vmid)
+ env[:ui].info(I18n.t("vagrant_libvirt.suspending_domain"))
+
+ domain = env[:libvirt_compute].servers.get(env[:machine].id.to_s)
+ raise Errors::NoDomainError if domain == nil
+
domain.suspend
- @logger.info("Machine #{vmid} is suspended ")
+ @logger.info("Machine #{env[:machine].id} is suspended ")
+
@app.call(env)
end
end
-
end
end
end
diff --git a/lib/vagrant-libvirt/action/wait_till_up.rb b/lib/vagrant-libvirt/action/wait_till_up.rb
index f42f901..694e8f9 100644
--- a/lib/vagrant-libvirt/action/wait_till_up.rb
+++ b/lib/vagrant-libvirt/action/wait_till_up.rb
@@ -47,6 +47,13 @@ module VagrantPlugins
@logger.info("Got IP address #{env[:ip_address]}")
@logger.info("Time for getting IP: #{env[:metrics]["instance_ip_time"]}")
+ # Save newly assigned IP address to machines data_dir
+ ip_file_path = env[:machine].data_dir + 'ip'
+ @logger.info("Saving IP address to #{ip_file_path} file.")
+ File.open(ip_file_path, 'w') do |file|
+ file.write(env[:ip_address])
+ end
+
# Machine has ip address assigned, now wait till we are able to
# connect via ssh.
env[:metrics]["instance_ssh_time"] = Util::Timer.time do
diff --git a/lib/vagrant-libvirt/errors.rb b/lib/vagrant-libvirt/errors.rb
index b158dec..eb113d5 100644
--- a/lib/vagrant-libvirt/errors.rb
+++ b/lib/vagrant-libvirt/errors.rb
@@ -85,6 +85,15 @@ module VagrantPlugins
class AttachDeviceError < VagrantLibvirtError
error_key(:attach_device_error)
end
+
+ class NoIpAddressError < VagrantLibvirtError
+ error_key(:no_ip_address_error)
+ end
+
+ class IpAddressMismatchError < VagrantLibvirtError
+ error_key(:ip_address_mismatch_error)
+ end
+
end
end
end
diff --git a/locales/en.yml b/locales/en.yml
index 94636e5..49bb09c 100644
--- a/locales/en.yml
+++ b/locales/en.yml
@@ -1,13 +1,13 @@
en:
vagrant_libvirt:
already_created: |-
- The machine is already created.
+ The domain is already created.
not_created: |-
- Machine is not created. Please run `vagrant up` first.
+ Domain is not created. Please run `vagrant up` first.
finding_volume: |-
Checking if volume is available.
creating_domain: |-
- Creating machine with the following settings...
+ Creating domain with the following settings...
uploading_volume: |-
Uploading base box image as volume into libvirt storage...
creating_domain_volume: |-
@@ -15,17 +15,21 @@ en:
removing_domain_volume: |-
Removing image (snapshot of base box volume).
starting_domain: |-
- Starting machine.
+ Starting domain.
terminating: |-
- Removing machine...
+ Removing domain...
poweroff_domain: |-
- Poweroff machine.
+ Poweroff domain.
destroy_domain: |-
- Removing machine...
+ Removing domain...
+ resuming_domain: |-
+ Resuming domain...
+ suspending_domain: |-
+ Suspending domain...
waiting_for_ready: |-
- Waiting for machine to become "ready"...
+ Waiting for domain to become "ready"...
waiting_for_ip: |-
- Waiting for machine to get an IP address...
+ Waiting for domain to get an IP address...
waiting_for_ssh: |-
Waiting for SSH to become available...
booted: |-
@@ -89,6 +93,12 @@ en:
No domain found. %{error_message}
attach_device_error: |-
Error while attaching new device to domain. %{error_message}
+ no_ip_address_error: |-
+ No IP address found.
+ ip_address_mismatch_error: |-
+ IP address mismatch. Possible reason is that domain IP address changed.
+ You can run `vagrant destroy` and then `vagrant up` to rebuild your
+ project.
states:
short_paused: |-
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/vagrant-libvirt.git
More information about the Pkg-ruby-extras-commits
mailing list