public static void main(String[] args) throws UnknownHostException { AmazonEC2 ec2 = new AmazonEC2Client(new ClasspathPropertiesFileCredentialsProvider()); Region usWest2 = Region.getRegion(Regions.US_WEST_2); ec2.setRegion(usWest2); List<String> instanceIds = new ArrayList<>(); String instanceid = null; DescribeInstancesRequest request = new DescribeInstancesRequest(); List<String> valuesT1 = new ArrayList<String>(); valuesT1.add("hz-nodes"); Filter filter = new Filter("tag-value", valuesT1); DescribeInstancesResult result = ec2.describeInstances(request.withFilters(filter)); List<Reservation> reservations = result.getReservations(); for (Reservation reservation : reservations) { List<Instance> instances = reservation.getInstances(); for (Instance instance : instances) { instanceid = instance.getInstanceId(); PrintManager.PrintMessage(instanceid); instanceIds.add(instanceid); List<Tag> abc = instance.getTags(); for (Tag aaa : abc) { PrintManager.PrintMessage(aaa.getKey() + " : " + aaa.getValue()); } } } instanceIds.remove("i-cb45adfc"); StopInstancesRequest stopReq = new StopInstancesRequest(instanceIds); ec2.stopInstances(stopReq); RebootInstancesRequest requestRe = new RebootInstancesRequest(instanceIds); ec2.rebootInstances(requestRe); }
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (obj instanceof DescribeInstancesRequest == false) return false; DescribeInstancesRequest other = (DescribeInstancesRequest) obj; if (other.getInstanceIds() == null ^ this.getInstanceIds() == null) return false; if (other.getInstanceIds() != null && other.getInstanceIds().equals(this.getInstanceIds()) == false) return false; if (other.getFilters() == null ^ this.getFilters() == null) return false; if (other.getFilters() != null && other.getFilters().equals(this.getFilters()) == false) return false; return true; }
/** * Provisions a new EC2 slave based on the currently running instance on EC2, instead of starting * a new one. */ public EC2AbstractSlave attach(String instanceId, TaskListener listener) throws AmazonClientException, IOException { PrintStream logger = listener.getLogger(); AmazonEC2 ec2 = getParent().connect(); try { logger.println("Attaching to " + instanceId); LOGGER.info("Attaching to " + instanceId); DescribeInstancesRequest request = new DescribeInstancesRequest(); request.setInstanceIds(Collections.singletonList(instanceId)); Instance inst = ec2.describeInstances(request).getReservations().get(0).getInstances().get(0); return newOndemandSlave(inst); } catch (FormException e) { throw new AssertionError(); // we should have discovered all // configuration issues upfront } }
private DescribeInstancesRequest buildDescribeInstancesRequest() { DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest() .withFilters(new Filter("instance-state-name").withValues("running", "pending")); for (Map.Entry<String, String> tagFilter : tags.entrySet()) { // for a given tag key, OR relationship for multiple different values describeInstancesRequest.withFilters( new Filter("tag:" + tagFilter.getKey()).withValues(tagFilter.getValue())); } if (!availabilityZones.isEmpty()) { // OR relationship amongst multiple values of the availability-zone filter describeInstancesRequest.withFilters( new Filter("availability-zone").withValues(availabilityZones)); } return describeInstancesRequest; }
public static Instance getInstance(String instanceId, EC2Cloud cloud) { if (instanceId == null || instanceId == "" || cloud == null) return null; Instance i = null; try { DescribeInstancesRequest request = new DescribeInstancesRequest(); request.setInstanceIds(Collections.<String>singletonList(instanceId)); AmazonEC2 ec2 = cloud.connect(); List<Reservation> reservations = ec2.describeInstances(request).getReservations(); if (!reservations.isEmpty()) { List<Instance> instances = reservations.get(0).getInstances(); if (!instances.isEmpty()) { i = instances.get(0); } } } catch (AmazonClientException e) { LOGGER.log(Level.WARNING, "Failed to fetch EC2 instance: " + instanceId, e); } return i; }
/** * Describe a set of specific instances. * * @param instanceIds the instance ids * @return the instances */ public List<Instance> describeInstances(String... instanceIds) { if (instanceIds == null || instanceIds.length == 0) { LOGGER.info("Getting all EC2 instances."); } else { LOGGER.info(String.format("Getting EC2 instances for %d ids.", instanceIds.length)); } List<Instance> instances = new LinkedList<Instance>(); AmazonEC2 ec2Client = ec2Client(); DescribeInstancesRequest request = new DescribeInstancesRequest(); if (instanceIds != null) { request.withInstanceIds(Arrays.asList(instanceIds)); } DescribeInstancesResult result = ec2Client.describeInstances(request); for (Reservation reservation : result.getReservations()) { instances.addAll(reservation.getInstances()); } LOGGER.info(String.format("Got %d EC2 instances.", instances.size())); return instances; }
// Returns pending/running instance ID list. public static ArrayList<String> getInstanceIdsByTag(AmazonEC2 ec2, String key, String value) { logger.fine("Requesting instances by tag " + key + "=" + value); // Create tag request. DescribeInstancesRequest instanceReq = new DescribeInstancesRequest(); Filter managerFilter = new Filter("tag:" + key).withValues(value), activeFilter = new Filter("instance-state-code").withValues("0", "16"); // 0||16 == pending||running // Send request. DescribeInstancesResult result = ec2.describeInstances(instanceReq.withFilters(managerFilter, activeFilter)); // Build instance ID list. ArrayList<String> ids = new ArrayList<String>(); for (Reservation reservation : result.getReservations()) { for (Instance instance : reservation.getInstances()) { ids.add(instance.getInstanceId()); } } logger.fine(ids.size() + " instances found with tag " + key + "=" + value); return ids; }
@Override // @HystrixCommand(fallback = my coole exception) // command for account id and client type -> generate new credentials public void processEvent(final CloudTrailEvent event) { String parameters = event.getEventData().getRequestParameters(); String instanceId = getFromParameters(parameters); AmazonEC2Client client = getClientForAccount( event.getEventData().getUserIdentity().getAccountId(), Region.getRegion(Regions.fromName(event.getEventData().getAwsRegion()))); DescribeInstancesRequest request = new DescribeInstancesRequest(); request.setInstanceIds(Collections.singleton(instanceId)); // try DescribeInstancesResult result = client.describeInstances(request); // catch credentials are old // throw new my coole exception ( account id, CLIENTTYPE.EC2, exception) -> this will trigger // hystrix LOG.info("SAVING RESULT INTO MAGIC DB", result); }
/** * Provisions an On-demand EC2 slave by launching a new instance or starting a previously-stopped * instance. */ private EC2AbstractSlave provisionOndemand( TaskListener listener, Label requiredLabel, EnumSet<ProvisionOptions> provisionOptions) throws AmazonClientException, IOException { PrintStream logger = listener.getLogger(); AmazonEC2 ec2 = getParent().connect(); try { logProvisionInfo(logger, "Considering launching " + ami + " for template " + description); KeyPair keyPair = getKeyPair(ec2); RunInstancesRequest riRequest = new RunInstancesRequest(ami, 1, 1); InstanceNetworkInterfaceSpecification net = new InstanceNetworkInterfaceSpecification(); riRequest.setEbsOptimized(ebsOptimized); if (useEphemeralDevices) { setupEphemeralDeviceMapping(riRequest); } else { setupCustomDeviceMapping(riRequest); } if (stopOnTerminate) { riRequest.setInstanceInitiatedShutdownBehavior(ShutdownBehavior.Stop); logProvisionInfo( logger, "Setting Instance Initiated Shutdown Behavior : ShutdownBehavior.Stop"); } else { riRequest.setInstanceInitiatedShutdownBehavior(ShutdownBehavior.Terminate); logProvisionInfo( logger, "Setting Instance Initiated Shutdown Behavior : ShutdownBehavior.Terminate"); } List<Filter> diFilters = new ArrayList<Filter>(); diFilters.add(new Filter("image-id").withValues(ami)); if (StringUtils.isNotBlank(getZone())) { Placement placement = new Placement(getZone()); if (getUseDedicatedTenancy()) { placement.setTenancy("dedicated"); } riRequest.setPlacement(placement); diFilters.add(new Filter("availability-zone").withValues(getZone())); } if (StringUtils.isNotBlank(getSubnetId())) { if (getAssociatePublicIp()) { net.setSubnetId(getSubnetId()); } else { riRequest.setSubnetId(getSubnetId()); } diFilters.add(new Filter("subnet-id").withValues(getSubnetId())); /* * If we have a subnet ID then we can only use VPC security groups */ if (!securityGroupSet.isEmpty()) { List<String> groupIds = getEc2SecurityGroups(ec2); if (!groupIds.isEmpty()) { if (getAssociatePublicIp()) { net.setGroups(groupIds); } else { riRequest.setSecurityGroupIds(groupIds); } diFilters.add(new Filter("instance.group-id").withValues(groupIds)); } } } else { /* No subnet: we can use standard security groups by name */ riRequest.setSecurityGroups(securityGroupSet); if (!securityGroupSet.isEmpty()) { diFilters.add(new Filter("instance.group-name").withValues(securityGroupSet)); } } String userDataString = Base64.encodeBase64String(userData.getBytes(StandardCharsets.UTF_8)); riRequest.setUserData(userDataString); riRequest.setKeyName(keyPair.getKeyName()); diFilters.add(new Filter("key-name").withValues(keyPair.getKeyName())); riRequest.setInstanceType(type.toString()); diFilters.add(new Filter("instance-type").withValues(type.toString())); if (getAssociatePublicIp()) { net.setAssociatePublicIpAddress(true); net.setDeviceIndex(0); riRequest.withNetworkInterfaces(net); } boolean hasCustomTypeTag = false; HashSet<Tag> instTags = null; if (tags != null && !tags.isEmpty()) { instTags = new HashSet<Tag>(); for (EC2Tag t : tags) { instTags.add(new Tag(t.getName(), t.getValue())); diFilters.add(new Filter("tag:" + t.getName()).withValues(t.getValue())); if (StringUtils.equals(t.getName(), EC2Tag.TAG_NAME_JENKINS_SLAVE_TYPE)) { hasCustomTypeTag = true; } } } if (!hasCustomTypeTag) { if (instTags == null) { instTags = new HashSet<Tag>(); } // Append template description as well to identify slaves provisioned per template instTags.add( new Tag( EC2Tag.TAG_NAME_JENKINS_SLAVE_TYPE, EC2Cloud.getSlaveTypeTagValue(EC2Cloud.EC2_SLAVE_TYPE_DEMAND, description))); } DescribeInstancesRequest diRequest = new DescribeInstancesRequest(); diRequest.setFilters(diFilters); logProvision(logger, "Looking for existing instances with describe-instance: " + diRequest); DescribeInstancesResult diResult = ec2.describeInstances(diRequest); EC2AbstractSlave[] ec2Node = new EC2AbstractSlave[1]; Instance existingInstance = null; if (!provisionOptions.contains(ProvisionOptions.FORCE_CREATE)) { reservationLoop: for (Reservation reservation : diResult.getReservations()) { for (Instance instance : reservation.getInstances()) { if (checkInstance(logger, instance, requiredLabel, ec2Node)) { existingInstance = instance; logProvision( logger, "Found existing instance: " + existingInstance + ((ec2Node[0] != null) ? (" node: " + ec2Node[0].getInstanceId()) : "")); break reservationLoop; } } } } if (existingInstance == null) { if (!provisionOptions.contains(ProvisionOptions.FORCE_CREATE) && !provisionOptions.contains(ProvisionOptions.ALLOW_CREATE)) { logProvision(logger, "No existing instance found - but cannot create new instance"); return null; } if (StringUtils.isNotBlank(getIamInstanceProfile())) { riRequest.setIamInstanceProfile( new IamInstanceProfileSpecification().withArn(getIamInstanceProfile())); } // Have to create a new instance Instance inst = ec2.runInstances(riRequest).getReservation().getInstances().get(0); /* Now that we have our instance, we can set tags on it */ if (instTags != null) { updateRemoteTags(ec2, instTags, "InvalidInstanceID.NotFound", inst.getInstanceId()); // That was a remote request - we should also update our // local instance data. inst.setTags(instTags); } logProvisionInfo(logger, "No existing instance found - created new instance: " + inst); return newOndemandSlave(inst); } if (existingInstance .getState() .getName() .equalsIgnoreCase(InstanceStateName.Stopping.toString()) || existingInstance .getState() .getName() .equalsIgnoreCase(InstanceStateName.Stopped.toString())) { List<String> instances = new ArrayList<String>(); instances.add(existingInstance.getInstanceId()); StartInstancesRequest siRequest = new StartInstancesRequest(instances); StartInstancesResult siResult = ec2.startInstances(siRequest); logProvisionInfo( logger, "Found stopped instance - starting it: " + existingInstance + " result:" + siResult); } else { // Should be pending or running at this point, just let it come up logProvisionInfo( logger, "Found existing pending or running: " + existingInstance.getState().getName() + " instance: " + existingInstance); } if (ec2Node[0] != null) { logProvisionInfo(logger, "Using existing slave: " + ec2Node[0].getInstanceId()); return ec2Node[0]; } // Existing slave not found logProvision(logger, "Creating new slave for existing instance: " + existingInstance); return newOndemandSlave(existingInstance); } catch (FormException e) { throw new AssertionError(e); // we should have discovered all // configuration issues upfront } catch (InterruptedException e) { throw new RuntimeException(e); } }
public void run() { logger.debug("started GridManager"); System.out.println("started GridManager"); AmazonSQSClient sqsClient = new AmazonSQSClient(papa.getCredentials()); AmazonEC2Client ec2Client = new AmazonEC2Client(papa.getCredentials()); // Get current imageID from the metadata table String imageID = Constants.imageID; // get the default imageID from Constants try { Connection conn = PooledConnectionFactory.INSTANCE.getCumulusConnection(); Statement stmt = conn.createStatement(); String imageQuery = "SELECT mvalue FROM cumulus.metadata WHERE mkey='imageID';"; ResultSet results = stmt.executeQuery(imageQuery); results.next(); // move the cursor into the results imageID = results.getString(1); } catch (SQLException e) { logger.warn(e); } if (imageID == null || imageID.equals("")) { // if we get an empty imageID revert to the hardcoded one imageID = Constants.imageID; } logger.debug(imageID); System.out.println(imageID); while (true) { // loop from startup to shutdown // check the number of messages in the queue. GetQueueAttributesRequest sqsRequest = new GetQueueAttributesRequest(papa.getDispatchQueue()) .withAttributeNames("ApproximateNumberOfMessages"); Integer sqsResult = null; try { sqsResult = Integer.valueOf( sqsClient .getQueueAttributes(sqsRequest) .getAttributes() .get("ApproximateNumberOfMessages")); } catch (AmazonServiceException e) { // Write out any exceptions that may have occurred. System.err.println("Error getting list of instances"); System.err.println("Caught Exception: " + e.getMessage()); System.err.println("Reponse Status Code: " + e.getStatusCode()); System.err.println("Error Code: " + e.getErrorCode()); System.err.println("Request ID: " + e.getRequestId()); } catch (AmazonClientException e) { logger.warn(e); continue; // if the error is due to being unable to connect to sqs it is likely transient, // and we should keep going until SQS comes back } catch (Exception e) { // caught another exception System.err.println(e); System.err.println("Did not exit cleanly"); // System.exit(1); } if (sqsResult == null) { System.err.println( "Couldn't get the number of items in the queue reverting to static functioning"); logger.error( "Couldn't get the number of items in the queue reverting to static functioning"); break; } System.out.println("Queue size=" + sqsResult); // check the number of running instances. DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest(); // get the number of running instances with our image ID describeInstancesRequest.withFilters( new Filter("image-id").withValues(imageID), new Filter("instance-state-name").withValues("running")); logger.debug("Getting list of active cumulus drones"); Integer numInstances = null; Integer numSpotRequests = null; Initializer.serialize("/tmp/dump.obj", papa.unitsOnServer); // TODO test this. // check number of open spot requests DescribeSpotInstanceRequestsRequest describeSpotInstancesRequest = new DescribeSpotInstanceRequestsRequest(); describeSpotInstancesRequest.withFilters(new Filter("state").withValues("open")); try { // Parse returned instances DescribeInstancesResult describeInstancesResult = ec2Client.describeInstances(describeInstancesRequest); if (describeInstancesResult.getReservations().size() == 0) { numInstances = 0; } else { Integer totalInstances = 0; for (Reservation i : describeInstancesResult.getReservations()) { totalInstances += i.getInstances().size(); } numInstances = totalInstances; } // Parse returned open spot requests DescribeSpotInstanceRequestsResult describeSpotReservationsResult = ec2Client.describeSpotInstanceRequests(describeSpotInstancesRequest); if (describeSpotReservationsResult.getSpotInstanceRequests().size() == 0) { numSpotRequests = 0; } else { Integer totalInstances = 0; for (SpotInstanceRequest i : describeSpotReservationsResult.getSpotInstanceRequests()) { totalInstances++; } numSpotRequests = totalInstances; } // System.out.println("num instances="+numInstances); } catch (AmazonServiceException e) { // Write out any exceptions that may have occurred. System.err.println("Error getting list of instances"); System.err.println("Caught Exception: " + e.getMessage()); System.err.println("Reponse Status Code: " + e.getStatusCode()); System.err.println("Error Code: " + e.getErrorCode()); System.err.println("Request ID: " + e.getRequestId()); // System.exit(1); } catch (Exception e) { // caught another exception System.err.println(e); System.err.println("Did not exit cleanly"); // System.exit(1); } if (numInstances == null || numSpotRequests == null) { logger.error( "Couldn't get the number of machines or requests reverting to static functioning"); break; } System.out.println("num instances=" + (numInstances + numSpotRequests)); // if queue is longer than the number of instances * idealMaxUnitsPerInstance Integer idealMaxUnitsPerInstance = Integer.valueOf(Constants.idealMaxUnitsPerInstance); if (sqsResult > (numInstances + numSpotRequests) * idealMaxUnitsPerInstance) { // we count pending spot instances too. Integer numToCreate = (sqsResult / idealMaxUnitsPerInstance) - numInstances + 1; // check current pricing of spot instances DescribeSpotPriceHistoryRequest historyRequest = new DescribeSpotPriceHistoryRequest() .withAvailabilityZone("us-east-1c") .withInstanceTypes(Constants.instanceType) .withProductDescriptions("Linux/UNIX (Amazon VPC)") .withStartTime(new Date(System.currentTimeMillis())); DescribeSpotPriceHistoryResult result = ec2Client.describeSpotPriceHistory(historyRequest); Double nowPrice = Double.valueOf(result.getSpotPriceHistory().get(0).getSpotPrice()); // If spot price is < constants.spotPrice launch numToCreate*Constants.percentSpot spot // instances Integer spotToCreate = 0; if (nowPrice < Double.valueOf(Constants.spotPrice)) { Double percentSpot = Double.valueOf(Constants.percentSpot); spotToCreate = (int) (numToCreate * percentSpot); numToCreate = (int) (numToCreate * (1 - percentSpot)); } try { System.out.println("regular instances: " + numToCreate); System.out.println("spot instances: " + spotToCreate); // Create regular and spot instances if (numToCreate > 0) { papa.createInstances(ec2Client, numToCreate, imageID); } if (spotToCreate > 0) { papa.createSpotInstances(ec2Client, spotToCreate, Constants.imageID); // FIXME } System.out.println("created instances"); } catch (Exception e) { // Report ec2 exceptions logger.error(e); e.printStackTrace(); continue; } } try { Thread.sleep(60000); // we wait for any new servers to start up } catch (InterruptedException e) { logger.error("Sqslistener was interrupted"); if (papa.getShuttingDown()) { break; } else { continue; } } } }