lib/chef/knife/openstack_server_create.rb in knife-openstack-1.3.2.pre vs lib/chef/knife/openstack_server_create.rb in knife-openstack-1.3.2.pre.1

- old
+ new

@@ -31,110 +31,109 @@ class OpenstackServerCreate < ServerCreateCommand include OpenstackHelpers include OpenstackServerCreateOptions include OpenstackServiceOptions + banner 'knife openstack server create (options)' - banner "knife openstack server create (options)" - def before_exec_command - super - # setup the create options - @create_options = { - :server_def => { - #servers require a name, knife-cloud generates the chef_node_name - :name => config[:chef_node_name], - :image_ref => service.get_image(locate_config_value(:image)).id, - :flavor_ref => service.get_flavor(locate_config_value(:flavor)).id, - :security_groups => locate_config_value(:openstack_security_groups), - :availability_zone => locate_config_value(:availability_zone), - "os:scheduler_hints" => locate_config_value(:openstack_scheduler_hints), - :metadata => locate_config_value(:metadata), - :key_name => locate_config_value(:openstack_ssh_key_id) - }, - :server_create_timeout => locate_config_value(:server_create_timeout) - } - unless locate_config_value(:openstack_volumes).nil? - counter = 99 - @create_options[:server_def][:block_device_mapping] = locate_config_value(:openstack_volumes).map do |vol| - counter += 1 - { - :volume_id => vol, - :delete_on_termination => false, - :device_name => "/dev/vd"+counter.chr, - :volume_size => nil, - } - end + super + # setup the create options + @create_options = { + server_def: { + # servers require a name, knife-cloud generates the chef_node_name + :name => config[:chef_node_name], + :image_ref => service.get_image(locate_config_value(:image)).id, + :flavor_ref => service.get_flavor(locate_config_value(:flavor)).id, + :security_groups => locate_config_value(:openstack_security_groups), + :availability_zone => locate_config_value(:availability_zone), + 'os:scheduler_hints' => locate_config_value(:openstack_scheduler_hints), + :metadata => locate_config_value(:metadata), + :key_name => locate_config_value(:openstack_ssh_key_id) + }, + server_create_timeout: locate_config_value(:server_create_timeout) + } + unless locate_config_value(:openstack_volumes).nil? + counter = 99 + @create_options[:server_def][:block_device_mapping] = locate_config_value(:openstack_volumes).map do |vol| + counter += 1 + { + volume_id: vol, + delete_on_termination: false, + device_name: '/dev/vd' + counter.chr, + volume_size: nil + } end + end - @create_options[:server_def].merge!({:user_data => locate_config_value(:user_data)}) if locate_config_value(:user_data) - @create_options[:server_def].merge!({:nics => locate_config_value(:network_ids).map { |nic| nic_id = { 'net_id' => nic }}}) if locate_config_value(:network_ids) + @create_options[:server_def].merge!(user_data: locate_config_value(:user_data)) if locate_config_value(:user_data) + @create_options[:server_def].merge!(nics: locate_config_value(:network_ids).map { |nic| nic_id = { 'net_id' => nic } }) if locate_config_value(:network_ids) - Chef::Log.debug("Create server params - server_def = #{@create_options[:server_def]}") - #set columns_with_info map - @columns_with_info = [ - {:label => 'Instance ID', :key => 'id'}, - {:label => 'Name', :key => 'name'}, - {:label => 'Public IP', :key => 'addresses', :value_callback => method(:primary_public_ip_address)}, - {:label => 'Private IP', :key => 'addresses', :value_callback => method(:primary_private_ip_address)}, - {:label => 'Flavor', :key => 'flavor', :value_callback => method(:get_id)}, - {:label => 'Image', :key => 'image', :value_callback => method(:get_id)}, - {:label => 'Keypair', :key => 'key_name'}, - {:label => 'State', :key => 'state'}, - {:label => 'Availability Zone', :key => 'availability_zone'} - ] + Chef::Log.debug("Create server params - server_def = #{@create_options[:server_def]}") + # set columns_with_info map + @columns_with_info = [ + { label: 'Instance ID', key: 'id' }, + { label: 'Name', key: 'name' }, + { label: 'Public IP', key: 'addresses', value_callback: method(:primary_public_ip_address) }, + { label: 'Private IP', key: 'addresses', value_callback: method(:primary_private_ip_address) }, + { label: 'Flavor', key: 'flavor', value_callback: method(:get_id) }, + { label: 'Image', key: 'image', value_callback: method(:get_id) }, + { label: 'Keypair', key: 'key_name' }, + { label: 'State', key: 'state' }, + { label: 'Availability Zone', key: 'availability_zone' } + ] end def get_id(value) value['id'] end # Setup the floating ip after server creation. def after_exec_command Chef::Log.debug("Addresses #{server.addresses}") - msg_pair("Public IP Address", primary_public_ip_address(server.addresses)) if primary_public_ip_address(server.addresses) - msg_pair("Private IP Address", primary_private_ip_address(server.addresses)) if primary_private_ip_address(server.addresses) + msg_pair('Public IP Address', primary_public_ip_address(server.addresses)) if primary_public_ip_address(server.addresses) + msg_pair('Private IP Address', primary_private_ip_address(server.addresses)) if primary_private_ip_address(server.addresses) floating_address = locate_config_value(:openstack_floating_ip) - bind_ip = primary_network_ip_address(server.addresses,server.addresses.keys[0]) + bind_ip = primary_network_ip_address(server.addresses, server.addresses.keys[0]) Chef::Log.debug("Floating IP Address requested #{floating_address}") - unless (floating_address == '-1') #no floating IP requested + unless (floating_address == '-1') # no floating IP requested addresses = service.connection.addresses - #floating requested without value + # floating requested without value if floating_address.nil? - free_floating = addresses.find_index {|a| a.fixed_ip.nil?} + free_floating = addresses.find_index { |a| a.fixed_ip.nil? } begin - if free_floating.nil? #no free floating IP found - error_message = "Unable to assign a Floating IP from allocated IPs." + if free_floating.nil? # no free floating IP found + error_message = 'Unable to assign a Floating IP from allocated IPs.' ui.fatal(error_message) - raise CloudExceptions::ServerSetupError, error_message + fail CloudExceptions::ServerSetupError, error_message else floating_address = addresses[free_floating].ip end rescue CloudExceptions::ServerSetupError => e cleanup_on_failure raise e end end # Pull the port_id for the associate_floating_ip - port_id = @service.network.list_ports[:body]['ports'].find {|x| x['fixed_ips'][0]['ip_address'] == bind_ip}['id'] - fixed_ip_address = service.network.list_ports[:body]["ports"].find {|x| x['id'] == port_id}['fixed_ips'][0]["ip_address"] + port_id = @service.network.list_ports[:body]['ports'].find { |x| x['fixed_ips'][0]['ip_address'] == bind_ip }['id'] + fixed_ip_address = service.network.list_ports[:body]['ports'].find { |x| x['id'] == port_id }['fixed_ips'][0]['ip_address'] floating_ip_id = get_floating_ip_id(floating_address) # Associate the floating ip via the neutron/network api - @service.network.associate_floating_ip(floating_ip_id, port_id, {:fixed_ip_address => fixed_ip_address }) + @service.network.associate_floating_ip(floating_ip_id, port_id, fixed_ip_address: fixed_ip_address) - #a bit of a hack, but server.reload takes a long time - (server.addresses['public'] ||= []) << {"version"=>4,"addr"=>floating_address} - msg_pair("Floating IP Address", floating_address) + # a bit of a hack, but server.reload takes a long time + (server.addresses['public'] ||= []) << { 'version' => 4, 'addr' => floating_address } + msg_pair('Floating IP Address', floating_address) end Chef::Log.debug("Addresses #{server.addresses}") Chef::Log.debug("Public IP Address actual: #{primary_public_ip_address(server.addresses)}") if primary_public_ip_address(server.addresses) - msg_pair("Private IP Address", primary_private_ip_address(server.addresses)) if primary_private_ip_address(server.addresses) + msg_pair('Private IP Address', primary_private_ip_address(server.addresses)) if primary_private_ip_address(server.addresses) super end def before_bootstrap super @@ -143,52 +142,52 @@ config[:ssh_password] = locate_config_value(:ssh_password) || server.password unless config[:openstack_ssh_key_id] # The bootstrap network is always initialised to 'public' when a network name isn't specified. Therefore, # only set the bootstrap network to 'private' if still initialised to public and nothing was specified for # the private network name. - config[:bootstrap_network] = 'private' if (config[:private_network] && config[:bootstrap_network] == 'public') + config[:bootstrap_network] = 'private' if config[:private_network] && config[:bootstrap_network] == 'public' # Which IP address to bootstrap unless config[:network] # --no-network bootstrap_ip_address = primary_public_ip_address(server.addresses) || - primary_private_ip_address(server.addresses) || - server.addresses.first[1][0]['addr'] + primary_private_ip_address(server.addresses) || + server.addresses.first[1][0]['addr'] Chef::Log.debug("No Bootstrap Network: #{config[:bootstrap_network]}") else bootstrap_ip_address = primary_network_ip_address(server.addresses, config[:bootstrap_network]) Chef::Log.debug("Bootstrap Network: #{config[:bootstrap_network]}") end Chef::Log.debug("Bootstrap IP Address: #{bootstrap_ip_address}") if bootstrap_ip_address.nil? - error_message = "No IP address available for bootstrapping." + error_message = 'No IP address available for bootstrapping.' ui.error(error_message) - raise CloudExceptions::BootstrapError, error_message + fail CloudExceptions::BootstrapError, error_message end config[:bootstrap_ip_address] = bootstrap_ip_address config[:hints] ||= {} - config[:hints]["openstack"] ||= {} + config[:hints]['openstack'] ||= {} end def validate_params! # set param vm_name to a random value if the name is not set by the user (plugin) config[:chef_node_name] = get_node_name(locate_config_value(:chef_node_name), locate_config_value(:chef_node_name_prefix)) errors = [] if locate_config_value(:bootstrap_protocol) == 'winrm' if locate_config_value(:winrm_password).nil? - errors << "You must provide Winrm Password." + errors << 'You must provide Winrm Password.' end elsif locate_config_value(:bootstrap_protocol) != 'ssh' - errors << "You must provide a valid bootstrap protocol. options [ssh/winrm]. For linux type images, options [ssh]" + errors << 'You must provide a valid bootstrap protocol. options [ssh/winrm]. For linux type images, options [ssh]' end - errors << "You must provide --image-os-type option [windows/linux]" if ! (%w(windows linux).include?(locate_config_value(:image_os_type))) - error_message = "" - raise CloudExceptions::ValidationError, error_message if errors.each{|e| ui.error(e); error_message = "#{error_message} #{e}."}.any? + errors << 'You must provide --image-os-type option [windows/linux]' unless %w(windows linux).include?(locate_config_value(:image_os_type)) + error_message = '' + fail CloudExceptions::ValidationError, error_message if errors.each { |e| ui.error(e); error_message = "#{error_message} #{e}." }.any? end def is_image_valid? service.get_image(locate_config_value(:image)).nil? ? false : true end @@ -198,13 +197,11 @@ end def is_floating_ip_valid? address = locate_config_value(:openstack_floating_ip) - if address == '-1' # no floating IP requested - return true - end + return true if address == '-1' # no floating IP requested addresses = service.connection.addresses return false if addresses.empty? # no floating IPs # floating requested without value if address.nil? @@ -223,26 +220,26 @@ end end def post_connection_validations errors = [] - errors << "You have not provided a valid image ID. Please note the options for this value are -I or --image." if !is_image_valid? - errors << "You have not provided a valid flavor ID. Please note the options for this value are -f or --flavor." if !is_flavor_valid? - errors << "You have either requested an invalid floating IP address or none are available." if !is_floating_ip_valid? - error_message = "" - raise CloudExceptions::ValidationError, error_message if errors.each{|e| ui.error(e); error_message = "#{error_message} #{e}."}.any? + errors << 'You have not provided a valid image ID. Please note the options for this value are -I or --image.' unless is_image_valid? + errors << 'You have not provided a valid flavor ID. Please note the options for this value are -f or --flavor.' unless is_flavor_valid? + errors << 'You have either requested an invalid floating IP address or none are available.' unless is_floating_ip_valid? + error_message = '' + fail CloudExceptions::ValidationError, error_message if errors.each { |e| ui.error(e); error_message = "#{error_message} #{e}." }.any? end def get_floating_ip_id(floating_address) # required for this method to work floating_ip_id = -1 # Figure out the id for the port that the floating ip you requested - @service.network.list_floating_ips[:body]["floatingips"].each do |x| - if x["floating_ip_address"] == floating_address - floating_ip_id = x["id"] + @service.network.list_floating_ips[:body]['floatingips'].each do |x| + if x['floating_ip_address'] == floating_address + floating_ip_id = x['id'] end end - return floating_ip_id + floating_ip_id end end end end end