You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by mf...@apache.org on 2010/08/06 12:14:42 UTC

svn commit: r982923 - in /incubator/deltacloud/trunk/examples: ./ ssh_to_ec2_instance.rb

Author: mfojtik
Date: Fri Aug  6 10:14:42 2010
New Revision: 982923

URL: http://svn.apache.org/viewvc?rev=982923&view=rev
Log:
Added connecting to EC2 instance example

Added:
    incubator/deltacloud/trunk/examples/
    incubator/deltacloud/trunk/examples/ssh_to_ec2_instance.rb

Added: incubator/deltacloud/trunk/examples/ssh_to_ec2_instance.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/examples/ssh_to_ec2_instance.rb?rev=982923&view=auto
==============================================================================
--- incubator/deltacloud/trunk/examples/ssh_to_ec2_instance.rb (added)
+++ incubator/deltacloud/trunk/examples/ssh_to_ec2_instance.rb Fri Aug  6 10:14:42 2010
@@ -0,0 +1,118 @@
+#
+# Copyright (C) 2009  Red Hat, Inc.
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+require 'rubygems'
+require 'net/ssh'
+require 'deltacloud'
+require 'socket'
+require 'timeout'
+
+# This Example will launch Fedora8 instance in EC2, create a new key and then
+# push a command into it.
+
+# Simple log wrapper to do fancy messages ;-)
+def log(message, &block)
+  cols, rows = `stty size`.split.map { |x| x.to_i }.reverse
+  print "[%s] %-#{cols-20}s" % [Time.now.strftime("%H:%M:%S"), "#{message}..."]
+  $stdout.flush
+  retval = block.call
+  puts "[OK]"
+  return retval
+end
+
+# Method will try to connect to given IP and port.
+# It will return true if this port is open.
+def is_port_open?(ip, port)
+  return false if ip==""
+  begin
+    Timeout::timeout(1) do
+      begin
+        s = TCPSocket.new(ip, port)
+        s.close
+        return true
+      rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
+        return false
+      end
+    end
+  rescue Timeout::Error
+  end
+  return false
+end
+
+# Prepare deltacloud client
+# TODO: Add your EC2 credentials here
+client = DeltaCloud.new('<API_KEY>', '<API_PASS>', 'http://localhost:3001/api')
+
+image = client.image('ami-2b5fba42') # Fedora 8
+hardware_profile = client.hardware_profile('m1.small')
+
+# First we need to create a new key
+# Because of 'create' operation, full PEM key will be returned in '.pem' method
+log "Creating a keypair with using name 'key1'" do
+  @key = client.create_key(:name => "key1")
+end
+
+# Launch instance with key_name
+log "Starting a new instance of Fedora 8" do
+  @instance = client.create_instance(image.id, :key_name => @key.id, :hardware_profile => hardware_profile.id)
+end
+
+# We need to wait for instance, so we pool EC2 every 5 seconds and ask
+# if instance is in RUNNING state
+log "Waiting for instance to become ready" do
+  while not @instance.state.eql?('RUNNING') do
+    @instance = client.instance(@instance.id)
+    @instance_host = @instance.public_addresses.first.strip
+    sleep 5
+  end
+end
+
+# Then, unfortunately, we need to wait again, for SSH port
+# TODO: You need to add SSH into default security group in EC2
+#       Otherwise, port 22 will be not open and this example will fail
+log "Waiting for port 22 to be open" do
+  while not is_port_open?(@instance_host, 22) do
+    sleep 5
+  end
+end
+
+@result = ""
+
+# If everything is running, we save PEM to filesystem and set required perms on it.
+# After that we connect to instance using this key and push some command to it.
+# You can also use SCP first, move some script here and launch it. Then wait for that
+# script output.
+log "Pushing a command into instance" do
+  File.open("/tmp/.ec2_private.key", 'w') do |f|
+    @key.pem.split("\n").each do |line|
+      f.puts(line.strip) if line.strip.size>0
+    end
+  end
+  FileUtils.chmod 0600, '/tmp/.ec2_private.key'
+  Net::SSH.start(@instance_host, 'root', { :keys => ['/tmp/.ec2_private.key'] }) do |session|
+    session.open_channel do |channel|
+      channel.on_data do |ch, data|
+        @result += data
+      end
+      channel.exec("uname -a")
+      session.loop
+    end
+  end
+end
+
+puts "------------------------\n: #{@result}"