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