def run
require 'fog'
require 'highline'
require 'net/ssh/multi'
require 'readline'
require 'net/scp'
server_name = @name_args[0]
terremark = Fog::Terremark.new(
:terremark_username => Chef::Config[:knife][:terremark_username],
:terremark_password => Chef::Config[:knife][:terremark_password],
:terremark_service => Chef::Config[:knife][:terremark_service] || :vcloud
)
$stdout.sync = true
puts "Instantiating vApp #{h.color(server_name, :bold)}"
vapp_id = terremark.instantiate_vapp_template(server_name).body['href'].split('/').last
deploy_task_id = terremark.deploy_vapp(vapp_id).body['href'].split('/').last
print "Waiting for deploy task [#{h.color(deploy_task_id, :bold)}]"
terremark.tasks.get(deploy_task_id).wait_for { print "."; ready? }
print "\n"
power_on_task_id = terremark.power_on(vapp_id).body['href'].split('/').last
print "Waiting for power on task [#{h.color(power_on_task_id, :bold)}]"
terremark.tasks.get(power_on_task_id).wait_for { print "."; ready? }
print "\n"
private_ip = terremark.get_vapp(vapp_id).body['IpAddress']
ssh_internet_service = terremark.create_internet_service(terremark.default_vdc_id, 'SSH', 'TCP', 22).body
ssh_internet_service_id = ssh_internet_service['Id']
public_ip = ssh_internet_service['PublicIpAddress']['Name']
public_ip_id = ssh_internet_service['PublicIpAddress']['Id']
ssh_node_service_id = terremark.add_node_service(ssh_internet_service_id, private_ip, 'SSH', 22).body['Id']
puts "\nBootstrapping #{h.color(server_name, :bold)}..."
password = terremark.get_vapp_template(12).body['Description'].scan(/\npassword: (.*)\n/).first.first
command = "bash -c '\necho nameserver 208.67.222.222 > /etc/resolv.conf\necho nameserver 208.67.220.220 >> /etc/resolv.conf\n\nif [ ! -f /usr/bin/chef-client ]; then\n apt-get update\n apt-get install -y ruby ruby1.8-dev build-essential wget libruby-extras libruby1.8-extras\n cd /tmp\n wget http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz\n tar xvf rubygems-1.3.6.tgz\n cd rubygems-1.3.6\n ruby setup.rb\n cp /usr/bin/gem1.8 /usr/bin/gem\n gem install chef ohai --no-rdoc --no-ri --verbose\nfi\n\nmkdir -p /etc/chef\n\n(\ncat <<'EOP'\n\#{IO.read(Chef::Config[:validation_key])}\nEOP\n) > /etc/chef/validation.pem\n\n(\ncat <<'EOP'\nlog_level :info\nlog_location STDOUT\nchef_server_url \"\#{Chef::Config[:chef_server_url]}\" \nvalidation_client_name \"\#{Chef::Config[:validation_client_name]}\"\nEOP\n) > /etc/chef/client.rb\n\n(\ncat <<'EOP'\n\#{{ \"run_list\" => @name_args[1..-1] }.to_json}\nEOP\n) > /etc/chef/first-boot.json\n\n/usr/bin/chef-client -j /etc/chef/first-boot.json'\n"
begin
ssh = Chef::Knife::Ssh.new
ssh.name_args = [ public_ip, "sudo #{command}" ]
ssh.config[:ssh_user] = "vcloud"
ssh.config[:manual] = true
ssh.config[:password] = password
ssh.password = password
ssh.run
rescue Errno::ETIMEDOUT
puts "Timed out on bootstrap, re-trying. Hit CTRL-C to abort."
puts "You probably need to log in to Terremark and powercycle #{h.color(@name_args[0], :bold)}"
retry
end
end