class Stack

Public Instance Methods

create(stackfile) click to toggle source
   # File lib/cloudstack-cli/commands/stack.rb
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   # count jobs with status 1 => Completed
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
destroy(stackfile) click to toggle source
    # File lib/cloudstack-cli/commands/stack.rb
114 def destroy(stackfile)
115   stack = parse_file(stackfile)
116   project_id = find_project_by_name(stack["project"])
117   servers = []
118   stack["servers"].each do |server|
119     string_to_array(server["name"]).each do |name|
120       if !options[:limit] || options[:limit].include?(name)
121         servers << name
122       end
123     end
124   end
125 
126   if servers.size == 0
127     say "No servers in stack selected.", :yellow
128     exit
129   end
130 
131   if options[:force] ||
132     yes?("Destroy #{'and expunge ' if options[:expunge]}the following VM(s)? #{servers.join(', ')} [y/N]:", :yellow)
133     jobs = []
134     servers.each do |name|
135       if server = client.list_virtual_machines(
136         name: name, project_id: project_id, listall: true
137         ).find {|vm| vm["name"] == name }
138         jobs << {
139           id: client.destroy_virtual_machine(
140             { id: server['id'], expunge: options[:expunge] },
141             { sync: true }
142           )['jobid'],
143           name: "Destroy VM #{name}"
144         }
145       end
146     end
147     watch_jobs(jobs)
148     say "Finished.", :green
149   end
150 end
find_project_by_name(name) click to toggle source
    # File lib/cloudstack-cli/commands/stack.rb
153 def find_project_by_name(name)
154   if name
155     unless project = client.list_projects(name: name, listall: true).first
156       say "Error: Project '#{name}' not found.", :red
157       exit 1
158     end
159     project_id = project['id']
160   else
161     project_id = nil
162   end
163   project_id
164 end
find_vm_in_stack(name, stack) click to toggle source
    # File lib/cloudstack-cli/commands/stack.rb
175 def find_vm_in_stack(name, stack)
176   stack["servers"].each do |server|
177     if string_to_array(server["name"]).find{|n| n == name }
178       return server
179     end
180   end
181 end
load_string_or_array(item) click to toggle source
    # File lib/cloudstack-cli/commands/stack.rb
166 def load_string_or_array(item)
167   return nil if item == nil
168   item.is_a?(Array) ? item : [item]
169 end
string_to_array(string) click to toggle source
    # File lib/cloudstack-cli/commands/stack.rb
171 def string_to_array(string)
172   string ? string.gsub(', ', ',').split(',') : nil
173 end