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']
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