The following attributes are only needed when creating a new vm
TODO: Add depreciation warning
The following attributes are only needed when creating a new vm
TODO: Add depreciation warning
Can be created by passing in :xml => “<xml to create domain/server>” or by providing :template_options => {
:name => "", :cpus => 1, :memory_size => 256 , :volume_template }
# File lib/fog/libvirt/models/compute/server.rb, line 47 def initialize(attributes={} ) @xml = attributes.delete(:xml) verify_boot_order(attributes[:boot_order]) super defaults.merge(attributes) initialize_nics initialize_volumes end
# File lib/fog/libvirt/models/compute/server.rb, line 84 def destroy(options={ :destroy_volumes => false}) poweroff unless stopped? connection.vm_action(uuid, :undefine) volumes.each { |vol| vol.destroy } if options[:destroy_volumes] true end
# File lib/fog/libvirt/models/compute/server.rb, line 80 def disk_path volumes.first.path if volumes and volumes.first end
# File lib/fog/libvirt/models/compute/server.rb, line 76 def mac nics.first.mac if nics && nics.first end
# File lib/fog/libvirt/models/compute/server.rb, line 55 def new? uuid.nil? end
# File lib/fog/libvirt/models/compute/server.rb, line 95 def poweroff connection.vm_action(uuid, :destroy) end
# File lib/fog/libvirt/models/compute/server.rb, line 129 def private_ip_address ip_address(:private) end
# File lib/fog/libvirt/models/compute/server.rb, line 133 def public_ip_address ip_address(:public) end
# File lib/fog/libvirt/models/compute/server.rb, line 115 def ready? state == "running" end
# File lib/fog/libvirt/models/compute/server.rb, line 91 def reboot connection.vm_action(uuid, :reboot) end
# File lib/fog/libvirt/models/compute/server.rb, line 103 def resume connection.vm_action(uuid, :resume) end
# File lib/fog/libvirt/models/compute/server.rb, line 59 def save raise Fog::Errors::Error.new('Saving an existing server may create a duplicate') unless new? create_or_clone_volume unless xml or @volumes @xml ||= to_xml self.id = (persistent ? connection.define_domain(xml) : connection.create_domain(xml)).uuid reload rescue => e raise Fog::Errors::Error.new("Error saving the server: #{e}") end
Transfers a file
# File lib/fog/libvirt/models/compute/server.rb, line 155 def scp(local_path, remote_path, upload_options = {}) requires :public_ip_address, :username scp_options = {} scp_options[:password] = password unless self.password.nil? scp_options[:key_data] = [private_key] if self.private_key scp_options[:proxy]= ssh_proxy unless self.ssh_proxy.nil? Fog::SCP.new(public_ip_address, username, scp_options).upload(local_path, remote_path, upload_options) end
Sets up a new key
# File lib/fog/libvirt/models/compute/server.rb, line 167 def setup(credentials = {}) requires :public_key, :public_ip_address, :username credentials[:proxy]= ssh_proxy unless ssh_proxy.nil? credentials[:password] = password unless self.password.nil? credentails[:key_data] = [private_key] if self.private_key commands = [ %Q{mkdir .ssh}, # %{passwd -l #{username}}, #Not sure if we need this here # %{echo "#{Fog::JSON.encode(attributes)}" >> ~/attributes.json} ] if public_key commands << %Q{echo "#{public_key}" >> ~/.ssh/authorized_keys} end # wait for domain to be ready Timeout::timeout(360) do begin Timeout::timeout(8) do Fog::SSH.new(public_ip_address, username, credentials.merge(:timeout => 4)).run('pwd') end rescue Errno::ECONNREFUSED sleep(2) retry rescue Net::SSH::AuthenticationFailed, Timeout::Error retry end end Fog::SSH.new(public_ip_address, username, credentials).run(commands) end
# File lib/fog/libvirt/models/compute/server.rb, line 99 def shutdown connection.vm_action(uuid, :shutdown) end
# File lib/fog/libvirt/models/compute/server.rb, line 137 def ssh(commands) requires :public_ip_address, :username ssh_options={} ssh_options[:password] = password unless password.nil? ssh_options[:proxy]= ssh_proxy unless ssh_proxy.nil? super(commands, ssh_options) end
# File lib/fog/libvirt/models/compute/server.rb, line 147 def ssh_proxy # if this is a direct connection, we don't need a proxy to be set. return nil unless @connection.uri.ssh_enabled? user_string= connection.uri.user ? "-l #{connection.uri.user}" : "" Net::SSH::Proxy::Command.new("ssh #{user_string} #{connection.uri.host} nc %h %p") end
# File lib/fog/libvirt/models/compute/server.rb, line 69 def start return true if active? connection.vm_action(uuid, :create) reload true end
# File lib/fog/libvirt/models/compute/server.rb, line 111 def stopped? state == "shutoff" end
# File lib/fog/libvirt/models/compute/server.rb, line 107 def suspend connection.vm_action(uuid, :suspend) end
# File lib/fog/libvirt/models/compute/server.rb, line 199 def update_display attrs = {} connection.update_display attrs.merge(:uuid => uuid) reload end
can't use deprecate method, as the value is part of the display hash
# File lib/fog/libvirt/models/compute/server.rb, line 205 def vnc_port Fog::Logger.deprecation("#{self.class} => #vnc_port is deprecated, use #display[:port] instead [light_black](#{caller.first})[/]") display[:port] end
# File lib/fog/libvirt/models/compute/server.rb, line 124 def volumes # lazy loading of volumes @volumes ||= (@volumes_path || []).map{|path| connection.volumes.all(:path => path).first } end
This retrieves the ip address of the mac address It returns an array of public and private ip addresses Currently only one ip address is returned, but in the future this could be multiple if the server has multiple network interface
# File lib/fog/libvirt/models/compute/server.rb, line 217 def addresses(connection=connection, options={}) mac=self.mac # Aug 24 17:34:41 juno arpwatch: new station 10.247.4.137 52:54:00:88:5a:0a eth0.4 # Aug 24 17:37:19 juno arpwatch: changed ethernet address 10.247.4.137 52:54:00:27:33:00 (52:54:00:88:5a:0a) eth0.4 # Check if another ip_command string was provided ip_command_global=connection.ip_command.nil? ? 'grep $mac /var/log/arpwatch.log|sed -e "s/new station//"|sed -e "s/changed ethernet address//g" |sed -e "s/reused old ethernet //" |tail -1 |cut -d ":" -f 4-| cut -d " " -f 3' : connection.ip_command ip_command_local=options[:ip_command].nil? ? ip_command_global : options[:ip_command] ip_command="mac=#{mac}; server_name=#{name}; "+ip_command_local ip_address=nil if connection.uri.ssh_enabled? # Retrieve the parts we need from the connection to setup our ssh options user=connection.uri.user #could be nil host=connection.uri.host keyfile=connection.uri.keyfile port=connection.uri.port # Setup the options ssh_options={} ssh_options[:keys]=[ keyfile ] unless keyfile.nil? ssh_options[:port]=port unless keyfile.nil? ssh_options[:paranoid]=true if connection.uri.no_verify? begin result=Fog::SSH.new(host, user, ssh_options).run(ip_command) rescue Errno::ECONNREFUSED raise Fog::Errors::Error.new("Connection was refused to host #{host} to retrieve the ip_address for #{mac}") rescue Net::SSH::AuthenticationFailed raise Fog::Errors::Error.new("Error authenticating over ssh to host #{host} and user #{user}") end # Check for a clean exit code if result.first.status == 0 ip_address=result.first.stdout.strip else # We got a failure executing the command raise Fog::Errors::Error.new("The command #{ip_command} failed to execute with a clean exit code") end else # It's not ssh enabled, so we assume it is if connection.uri.transport=="tls" raise Fog::Errors::Error.new("TlS remote transport is not currently supported, only ssh") end # Execute the ip_command locally # Initialize empty ip_address string ip_address="" IO.popen("#{ip_command}") do |p| p.each_line do |l| ip_address+=l end status=Process.waitpid2(p.pid)[1].exitstatus if status!=0 raise Fog::Errors::Error.new("The command #{ip_command} failed to execute with a clean exit code") end end #Strip any new lines from the string ip_address=ip_address.chomp end # The Ip-address command has been run either local or remote now if ip_address=="" #The grep didn't find an ip address result" ip_address=nil else # To be sure that the command didn't return another random string # We check if the result is an actual ip-address # otherwise we return nil unless ip_address=~/^(\d{1,3}\.){3}\d{1,3}$/ raise Fog::Errors::Error.new( "The result of #{ip_command} does not have valid ip-address format\n"+ "Result was: #{ip_address}\n" ) end end return { :public => [ip_address], :private => [ip_address]} end
# File lib/fog/libvirt/models/compute/server.rb, line 325 def create_or_clone_volume options = {:name => volume_name || default_volume_name} # Check if a disk template was specified if volume_template_name template_volume = connection.volumes.all(:name => volume_template_name).first raise Fog::Errors::Error.new("Template #{volume_template_name} not found") unless template_volume begin volume = template_volume.clone("#{options[:name]}") rescue => e raise Fog::Errors::Error.new("Error creating the volume : #{e}") end else # If no template volume was given, let's create our own volume options[:format_type] = volume_format_type if volume_format_type options[:capacity] = volume_capacity if volume_capacity options[:allocation] = volume_allocation if volume_allocation begin volume = connection.volumes.create(options) rescue => e raise Fog::Errors::Error.new("Error creating the volume : #{e}") end end @volumes.nil? ? @volumes = [volume] : @volumes << volume end
# File lib/fog/libvirt/models/compute/server.rb, line 377 def default_boot_order %w[hd cdrom network] end
# File lib/fog/libvirt/models/compute/server.rb, line 389 def default_display {:port => '-1', :listen => '127.0.0.1', :type => 'vnc', :password => '' } end
# File lib/fog/libvirt/models/compute/server.rb, line 351 def default_iso_dir "/var/lib/libvirt/images" end
# File lib/fog/libvirt/models/compute/server.rb, line 355 def default_volume_name "#{name}.#{volume_format_type || 'img'}" end
# File lib/fog/libvirt/models/compute/server.rb, line 359 def defaults { :persistent => true, :cpus => 1, :memory_size => 256 *1024, :name => randomized_name, :os_type => "hvm", :arch => "x86_64", :domain_type => "kvm", :iso_dir => default_iso_dir, :network_interface_type => "network", :network_nat_network => "default", :network_bridge_name => "br0", :boot_order => default_boot_order, :display => default_display } end
# File lib/fog/libvirt/models/compute/server.rb, line 311 def initialize_nics if nics nics.map! { |nic| nic.is_a?(Hash) ? connection.nics.new(nic) : nic } else self.nics = [connection.nics.new({:type => network_interface_type, :bridge => network_bridge_name, :network => network_nat_network})] end end
# File lib/fog/libvirt/models/compute/server.rb, line 319 def initialize_volumes if attributes[:volumes] && !attributes[:volumes].empty? @volumes = attributes[:volumes].map { |vol| vol.is_a?(Hash) ? connection.volumes.new(vol) : vol } end end
# File lib/fog/libvirt/models/compute/server.rb, line 307 def ip_address(key) addresses[key].nil? ? nil : addresses[key].first end
# File lib/fog/libvirt/models/compute/server.rb, line 381 def verify_boot_order order = [] if order order.each do |b| raise "invalid boot order, possible values are: hd, network and/or cdrom" unless default_boot_order.include?(b) end end end