

import java.util.ArrayList;
import java.util.List;

import libcloud.DriverFactory;
import libcloud.NodeDriver;
import libcloud.DriverFactory.Provider;
import libcloud.data.NodeImage;
import libcloud.data.NodeLocation;
import libcloud.data.NodeSize;
import libcloud.interfaces.INode;
import libcloud.providers.amazon.EC2USEastDriver;
import libcloud.providers.ibm.IBMDriver;
import libcloud.providers.rackspace.RackspaceDriver;

/*
 * Illustrates how to interact with multiple cloud providers using a common
 * interface using Apache libcloud
 */
public class Example {

	/*
	 * Entry point of execution.
	 */
	public static void main(String[] args) {
		// Fetch driver(s).
		Class<NodeDriver> ibmClass = DriverFactory.getDriver(Provider.IBM);
		IBMDriver ibmDriver = (IBMDriver)DriverFactory.constructDriver(ibmClass, "username", "password");
		Class<NodeDriver> ec2USEastClass = DriverFactory.getDriver(Provider.EC2_US_EAST);
		EC2USEastDriver ec2USEastDriver = (EC2USEastDriver)DriverFactory.constructDriver(ec2USEastClass, "access key id", "access key");
		Class<NodeDriver> rackspaceClass = DriverFactory.getDriver(Provider.RACKSPACE);
		RackspaceDriver rackspaceDriver = (RackspaceDriver)DriverFactory.constructDriver(rackspaceClass, "your username", "your api key");
		
		// Insert driver(s) into array for generic processing.
		List<NodeDriver> drivers = new ArrayList<NodeDriver>();
		drivers.add(ibmDriver);
		drivers.add(ec2USEastDriver);
		drivers.add(rackspaceDriver);
		
		// Process drivers.
		for (NodeDriver driver : drivers) {
			System.out.println(driver.getName() + ':');
			List<INode> nodes = driver.listNodes();
			List<NodeImage> images = driver.listImages();
			List<NodeSize> sizes = driver.listSizes();
			List<NodeLocation> locations = driver.listLocations();
			
			System.out.println("\t" + nodes.size() + " Nodes: " + nodes);
			System.out.println("\t" + images.size() + " Images: " + images);
			System.out.println("\t" + sizes.size() + " Sizes: " + sizes);
			System.out.println("\t" + locations.size() + " Locations: " + locations);
		}
	}
}
