# File lib/fog/compute/openstack/requests/create_server.rb, line 5
        def create_server(name, image_ref, flavor_ref, options = {})
          data = {
            'server' => {
              'flavorRef' => flavor_ref,
              'name'      => name
            }
          }
          data['server']['imageRef'] = image_ref if image_ref

          vanilla_options = ['metadata', 'accessIPv4', 'accessIPv6',
                             'availability_zone', 'user_data', 'key_name',
                             'adminPass', 'config_drive', 'min_count', 'max_count',
                             'return_reservation_id']
          vanilla_options.select { |o| options[o] }.each do |key|
            data['server'][key] = options[key]
          end

          if options['security_groups']
            # security names requires a hash with a name prefix
            data['server']['security_groups'] =
              Array(options['security_groups']).map do |sg|
                name = if sg.kind_of?(Fog::Compute::OpenStack::SecurityGroup)
                         sg.name
                       else
                         sg
                       end
                {:name => name}
              end
          end

          if options['personality']
            data['server']['personality'] = []
            options['personality'].each do |file|
              data['server']['personality'] << {
                'contents' => Base64.encode64(file['contents'] || file[:contents]),
                'path'     => file['path'] || file[:path]
              }
            end
          end

          if options['nics']
            data['server']['networks'] =
              Array(options['nics']).map do |nic|
                neti = {}
                neti['uuid'] = (nic['net_id'] || nic[:net_id]) unless (nic['net_id'] || nic[:net_id]).nil?
                neti['fixed_ip'] = (nic['v4_fixed_ip'] || nic[:v4_fixed_ip]) unless (nic['v4_fixed_ip'] || nic[:v4_fixed_ip]).nil?
                neti['port'] = (nic['port_id'] || nic[:port_id]) unless (nic['port_id'] || nic[:port_id]).nil?
                neti
              end
          end

          if options['os:scheduler_hints']
            data['os:scheduler_hints'] = options['os:scheduler_hints']
          end

          if (block_device_mapping = options['block_device_mapping_v2'])
            data['server']['block_device_mapping_v2'] = [block_device_mapping].flatten.collect do |mapping|
              entered_block_device_mapping = {}
              [:boot_index, :delete_on_termination, :destination_type, :device_name, :device_type, :disk_bus,
               :guest_format, :source_type, :uuid, :volume_size].each do |index|
                entered_block_device_mapping[index.to_s] = mapping[index] if mapping.key?(index)
              end
              entered_block_device_mapping
            end
          elsif (block_device_mapping = options['block_device_mapping'])
            data['server']['block_device_mapping'] = [block_device_mapping].flatten.collect do |mapping|
              {
                'delete_on_termination' => mapping[:delete_on_termination],
                'device_name'           => mapping[:device_name],
                'volume_id'             => mapping[:volume_id],
                'volume_size'           => mapping[:volume_size],
              }
            end
          end

          path = options['block_device_mapping'] ? 'os-volumes_boot' : 'servers'

          request(
            :body    => Fog::JSON.encode(data),
            :expects => [200, 202],
            :method  => 'POST',
            :path    => path
          )
        end