13 def create(stackfile)
14 stack = parse_file(stackfile)
15 project_id = find_project_by_name(stack["project"])
16
17 say "Create stack #{stack["name"]}...", :green
18 jobs = []
19 stack["servers"].each do |instance|
20 string_to_array(instance["name"]).each do |name|
21 if !options[:limit] || options[:limit].include?(name)
22 if server = client.list_virtual_machines(
23 name: name, project_id: project_id, listall: true
24 ).find {|vm| vm["name"] == name }
25 say "VM #{name} (#{server["state"]}) already exists.", :yellow
26 jobs << {
27 id: 0,
28 name: "Create VM #{name}",
29 status: 3
30 }
31 else
32 options.merge!({
33 displayname: instance["decription"],
34 zone: instance["zone"] || stack["zone"],
35 project: stack["project"],
36 template: instance["template"],
37 iso: instance["iso"] ,
38 offering: instance["offering"],
39 networks: load_string_or_array(instance["networks"]),
40 ip_network_list: instance["ip_network_list"],
41 disk_offering: instance["disk_offering"],
42 size: instance["disk_size"],
43 group: instance["group"] || stack["group"],
44 keypair: instance["keypair"] || stack["keypair"],
45 ip_address: instance["ip_address"]
46 })
47 vm_options_to_params
48 jobs << {
49 job_id: nil,
50 args: options.merge(name: name),
51 name: "Create VM #{name}",
52 status: -1
53 }
54 end
55 end
56 end
57 end
58
59 if jobs.count{|job| job[:status] < 1 } > 0
60 run_background_jobs(jobs, "deploy_virtual_machine")
61 end
62
63
64 successful_jobs = jobs.count {|job| job[:status] == 1 }
65 unless successful_jobs == 0 || options[:skip_forwarding_rules]
66 say "Check for port forwarding rules...", :green
67 pjobs = []
68 jobs.select{|job| job[:status] == 1}.each do |job|
69 vm = job[:result]["virtualmachine"]
70 vm_def = find_vm_in_stack(vm["name"], stack)
71 if port_rules = string_to_array(vm_def["port_rules"])
72 create_port_rules(vm, port_rules, false).each_with_index do |job_id, index|
73 job_name = "Create port forwarding rules (#{port_rules[index]}) for VM #{vm["name"]}"
74 pjobs << {id: job_id, name: job_name}
75 end
76 end
77 end
78 watch_jobs(pjobs)
79 pjobs.each do |job|
80 if job[:result]
81 result = job[:result]["portforwardingrule"]
82 puts "Created port forwarding rule #{result['ipaddress']}:#{result['publicport']} => #{result['privateport']} for VM #{result['virtualmachinename']}"
83 end
84 end
85 end
86 say "Finished.", :green
87
88 if successful_jobs > 0
89 if options[:assumeyes] || yes?("Display password(s) for VM(s)? [y/N]:", :yellow)
90 pw_table = [%w(VM Password)]
91 jobs.select {|job| job[:status] == 1 && job[:result] }.each do |job|
92 if result = job[:result]["virtualmachine"]
93 pw_table << ["#{result["name"]}:", result["password"] || "n/a"]
94 end
95 end
96 print_table(pw_table) if pw_table.size > 0
97 end
98 end
99 end