All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.deeplearning4j.aws.ec2.Ec2BoxCreator Maven / Gradle / Ivy

There is a newer version: 0.9.1
Show newest version
/*
 *
 *  * Copyright 2015 Skymind,Inc.
 *  *
 *  *    Licensed 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.
 *
 */

package org.deeplearning4j.aws.ec2;

import com.amazonaws.regions.*;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.model.*;
import org.deeplearning4j.aws.s3.BaseS3;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

/**
 * Creates Ec2Boxes
 * @author Adam Gibson
 *
 */
public class Ec2BoxCreator extends BaseS3 {


	private String amiId;
	private int numBoxes;
	private String size;
	private List boxesCreated;
	private String securityGroupId;
	private String keyPair;
    private Regions regions = Regions.DEFAULT_REGION;
	private static final Logger log = LoggerFactory.getLogger(Ec2BoxCreator.class);
	
	//centos
	public final static String DEFAULT_AMI = "ami-8997afe0";
	/**
	 * 
	 * @param numBoxes number of boxes
	 * @param size the size of the instances
	 */
	public Ec2BoxCreator(int numBoxes,String size,String securityGroupId,String keyPair) {
		this(DEFAULT_AMI,numBoxes,size,securityGroupId,keyPair);
	}


	/**
	 * 
	 * @param amiId amazon image id
	 * @param numBoxes number of boxes
	 * @param size the size of the instances
	 * @param securityGroupId
	 */
	public Ec2BoxCreator(String amiId, int numBoxes,String size,String securityGroupId,String keyPair) {
		super();
		this.amiId = amiId;
		this.numBoxes = numBoxes;
		this.size = size;
		this.keyPair = keyPair;
		this.securityGroupId = securityGroupId;
	}

	public void createSpot() {
		// Initializes a Spot Instance Request
		RequestSpotInstancesRequest requestRequest = new RequestSpotInstancesRequest();

		// Request 1 x t1.micro instance with a bid price of $0.03.
		requestRequest.setSpotPrice("0.03");
		requestRequest.setInstanceCount(Integer.valueOf(1));

		// Setup the specifications of the launch. This includes the
		// instance type (e.g. t1.micro) and the latest Amazon Linux
		// AMI id available. Note, you should always use the latest
		// Amazon Linux AMI id or another of your choosing.
		LaunchSpecification launchSpecification = new LaunchSpecification();
		launchSpecification.setImageId("ami-8c1fece5");
		launchSpecification.setInstanceType("t1.micro");

		// Add the security group to the request.
		List securityGroups = new ArrayList();
		securityGroups.add("GettingStartedGroup");
		launchSpecification.setSecurityGroups(securityGroups);

		// Add the launch specifications to the request.
		requestRequest.setLaunchSpecification(launchSpecification);

		// Call the RequestSpotInstance API.
		RequestSpotInstancesResult requestResult = getEc2().requestSpotInstances(requestRequest);


		List requestResponses = requestResult.getSpotInstanceRequests();

		// Setup an arraylist to collect all of the request ids we want to
		// watch hit the running state.
		List spotInstanceRequestIds = new ArrayList<>();

		// Add all of the request ids to the hashset, so we can determine when they hit the
		// active state.
		for (SpotInstanceRequest requestResponse : requestResponses) {
			System.out.println("Created Spot Request: "+requestResponse.getSpotInstanceRequestId());
			spotInstanceRequestIds.add(requestResponse.getSpotInstanceRequestId());
		}

	}

    public void setRegion(Regions regions) {
        this.regions = regions;
    }


    /**
     * Create the instances
     */
    public void create() {
		RunInstancesRequest runInstancesRequest = 
				new RunInstancesRequest().withImageId(amiId)
				.withInstanceType(size).withKeyName(keyPair)
				.withMinCount(1).withSecurityGroupIds(securityGroupId)
				.withMaxCount(numBoxes);
        AmazonEC2 ec2 = getEc2();
        ec2.setRegion(com.amazonaws.regions.Region.getRegion(regions));
		List boxes  = ec2.runInstances(runInstancesRequest)
				.getReservation().getInstances();
		if(boxesCreated == null) {
			boxesCreated = new ArrayList<>();
			for(Instance i : boxes)
				boxesCreated.add(i.getInstanceId());
			
			
			
			log.info("Boxes created " + boxesCreated);
		}
		else {
			blowupBoxes();
			boxesCreated.clear();
			for(Instance i : boxes)
				boxesCreated.add(i.getInstanceId());
			
		}
	}

	
	

	public List blowupBoxes() {
		TerminateInstancesRequest request = new TerminateInstancesRequest()
		.withInstanceIds(boxesCreated);
		
		if(boxesCreated != null) {
			TerminateInstancesResult result = getEc2().terminateInstances(request);
			List change = result.getTerminatingInstances();
			log.info("Boxes destroyed " + boxesCreated);
			return change;
		}
		
		return Collections.emptyList();
	}
	
	
	public void blockTillAllRunning() {
		while(!allRunning()) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				Thread.currentThread().interrupt();
			}
			log.info("Not all created...");
		}
	}
	
	public boolean allRunning() {
		if(boxesCreated == null)
			return false;
		else {
			DescribeInstancesResult result = getEc2().describeInstances();
			List reservations = result.getReservations();
			for(Reservation r : reservations) {
				List instances = r.getInstances();
				for(Instance instance : instances) {
					InstanceState state = instance.getState();
					if(state.getCode() == 48)
						continue;
					if(state.getCode() != 16)
						return false;
				}
			}
		
			return true;
		}
		
		
	}

	public List getHosts() {
		DescribeInstancesResult result = getEc2().describeInstances();
		List hosts = new ArrayList<>();
		List reservations = result.getReservations();
		for(Reservation r : reservations) {
			List instances = r.getInstances();
			for(Instance instance : instances) {
				InstanceState state = instance.getState();
				if(state.getCode() == 48)
					continue;
				hosts.add(instance.getPublicDnsName());
			
			}
		}
		
		return hosts;
	}

	public  List getBoxesCreated() {
		return boxesCreated;
	}




}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy