def call(env)
config = env[:machine].provider_config
name = env[:domain_name]
console = config.console
cpus = config.cpus
memory_size = config.memory*1024
if config.cluster == nil
cluster = env[:ovirt_compute].clusters.first
else
cluster = OVirtProvider::Util::Collection.find_matching(
env[:ovirt_compute].clusters.all, config.cluster)
end
raise Error::NoClusterError if cluster == nil
env[:ovirt_cluster] = cluster
template = OVirtProvider::Util::Collection.find_matching(
env[:ovirt_compute].templates.all, config.template)
if template == nil
raise Error::NoTemplateError,
:template_name => config.template
end
env[:ui].info(I18n.t("vagrant_ovirt3.creating_vm"))
env[:ui].info(" -- Name: #{name}")
env[:ui].info(" -- Cpus: #{cpus}")
env[:ui].info(" -- Memory: #{memory_size/1024}M")
env[:ui].info(" -- Template: #{template.name}")
env[:ui].info(" -- Datacenter: #{config.datacenter}")
env[:ui].info(" -- Cluster: #{cluster.name}")
env[:ui].info(" -- Console: #{console}")
if config.disk_size
env[:ui].info(" -- Disk size: #{config.disk_size}G")
end
attr = {
:name => name,
:cores => cpus,
:memory => memory_size*1024,
:cluster => cluster.id,
:template => template.id,
:display => {:type => console },
}
begin
server = env[:ovirt_compute].servers.create(attr)
rescue OVIRT::OvirtException => e
raise Errors::FogCreateServerError,
:error_message => e.message
end
env[:machine].id = server.id
env[:ui].info(I18n.t("vagrant_ovirt3.wait_for_ready_vm"))
for i in 0..10
ready = true
server = env[:ovirt_compute].servers.get(env[:machine].id.to_s)
server.volumes.each do |volume|
if volume.status != 'ok'
ready = false
break
end
end
break if ready
sleep 2
end
if not ready
raise Errors::WaitForReadyVmTimeout
end
@app.call(env)
end