/*** * Get list of EC2 {@link Instance}s for a auto scaling group * * @param groupName Auto scaling group name * @param status Instance status (eg. running) * @return List of EC2 instances found for the input auto scaling group */ public List<Instance> getInstancesForGroup(String groupName, String status) { final AmazonEC2 amazonEC2 = getEc2Client(); final DescribeInstancesResult instancesResult = amazonEC2.describeInstances(new DescribeInstancesRequest() .withFilters(new Filter().withName("tag:aws:autoscaling:groupName").withValues(groupName))); final List<Instance> instances = new ArrayList<>(); for (Reservation reservation : instancesResult.getReservations()) { for (Instance instance : reservation.getInstances()) { if (null == status|| null == instance.getState() || status.equals(instance.getState().getName())) { instances.add(instance); LOGGER.info("Found instance: " + instance + " which qualified filter: " + status); } else { LOGGER.info("Found instance: " + instance + " but did not qualify for filter: " + status); } } } return instances; }
public Filter unmarshall(StaxUnmarshallerContext context) throws Exception { Filter filter = new Filter(); int originalDepth = context.getCurrentDepth(); int targetDepth = originalDepth + 1; if (context.isStartOfDocument()) targetDepth += 1; while (true) { XMLEvent xmlEvent = context.nextEvent(); if (xmlEvent.isEndDocument()) return filter; if (xmlEvent.isAttribute() || xmlEvent.isStartElement()) { if (context.testExpression("Name", targetDepth)) { filter.setName(StringStaxUnmarshaller.getInstance().unmarshall(context)); continue; } if (context.testExpression("Value", targetDepth)) { filter.withValues(new ArrayList<String>()); continue; } if (context.testExpression("Value/item", targetDepth)) { filter.withValues(StringStaxUnmarshaller.getInstance().unmarshall(context)); continue; } } else if (xmlEvent.isEndElement()) { if (context.getCurrentDepth() < originalDepth) { return filter; } } } }
new Filter().withName("group-name").withValues(config.getACLGroupName()); String vpcid = instanceInfo.getVpcId(); if (vpcid == null || vpcid.isEmpty()) { Filter vpcFilter = new Filter().withName("vpc-id").withValues(vpcid); DescribeSecurityGroupsRequest req = new DescribeSecurityGroupsRequest().withFilters(nameFilter, vpcFilter);
protected String getVpcGoupId() { AmazonEC2 client = null; try { client = getEc2Client(); Filter nameFilter = new Filter().withName("group-name").withValues(config.getACLGroupName()); // SG Filter vpcFilter = new Filter().withName("vpc-id").withValues(instanceInfo.getVpcId()); DescribeSecurityGroupsRequest req = new DescribeSecurityGroupsRequest().withFilters(nameFilter, vpcFilter); DescribeSecurityGroupsResult result = client.describeSecurityGroups(req); for (SecurityGroup group : result.getSecurityGroups()) { logger.debug( "got group-id:{} for group-name:{},vpc-id:{}", group.getGroupId(), config.getACLGroupName(), instanceInfo.getVpcId()); return group.getGroupId(); } logger.error( "unable to get group-id for group-name={} vpc-id={}", config.getACLGroupName(), instanceInfo.getVpcId()); return ""; } finally { if (client != null) client.shutdown(); } }
private Filter[] getInstanceFilters(final String instanceType) { // Setup a filter to find any previously generated EC2 instances. return new Filter[]{ new Filter("tag:" + this.instanceTag.getKey()).withValues(this.instanceTag.getValue()), new Filter("instance-state-name").withValues("running"), new Filter("instance-type").withValues(instanceType) }; }
private ArrayList<Filter> buildFilters() { final ArrayList<Filter> filters = new ArrayList<Filter>(); if (isRunningStateOnly()) { final Filter filter = new Filter("instance-state-name").withValues(InstanceStateName.Running.toString()); filters.add(filter); } if (null != getFilterParams()) { for (final String filterParam : getFilterParams()) { final String[] x = filterParam.split("=", 2); if (!"".equals(x[0]) && !"".equals(x[1])) { filters.add(new Filter(x[0]).withValues(x[1].split(","))); } } } return filters; }
@Override @Cacheable(cacheNames = "ami-expiration-time", cacheManager = "oneMinuteTTLCacheManager") public ZonedDateTime getExpirationTime(String regionName, String imageOwner, String imageId) { // tags are only visible in the owning account of the image final AmazonEC2Client ec2 = clientProvider.getClient(AmazonEC2Client.class, imageOwner, Region.getRegion(Regions.fromName(regionName))); final DescribeTagsRequest tagsRequest = new DescribeTagsRequest().withFilters( new Filter("resource-id").withValues(imageId), new Filter("resource-type").withValues("image"), new Filter("key").withValues(TAG_KEY)); return ec2.describeTags(tagsRequest).getTags().stream() .findFirst() .map(TagDescription::getValue) .map(value -> ZonedDateTime.parse(value, ISO_DATE_TIME)) .orElse(null); } }
private String getClusterHeadInstanceId(String jobFlowId) throws Exception { DescribeInstancesResult r=ec2Client.describeInstances( new DescribeInstancesRequest().withFilters( new Filter().withName("tag:aws:elasticmapreduce:instance-group-role").withValues("MASTER"), new Filter().withName("tag:aws:elasticmapreduce:job-flow-id").withValues(jobFlowId) ) ); List<Reservation> instances=r.getReservations(); if(instances.size() != 1) throw new Exception("Could not find cluster head ["+jobFlowId+"]"); return instances.get(0).getInstances().get(0).getInstanceId(); }
/** * Fetches and instance's name Tag or null if it does not have one * @param instanceId * @param amazonEC2 * @return */ public static String getInstanceName(String instanceId, AmazonEC2 amazonEC2){ DescribeTagsResult result = amazonEC2.describeTags(new DescribeTagsRequest().withFilters( new Filter().withName("resource-id").withValues(instanceId), new Filter().withName("resource-type").withValues("instance"), new Filter().withName("key").withValues(TAG_KEY_NAME))); if(result.getTags().isEmpty()){ return null; } String name = result.getTags().get(0).getValue(); return name == null || name.trim().equals("") ? null : name; }
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; } }
/** * Get a list of security group ids for the slave */ private List<String> getEc2SecurityGroups(AmazonEC2 ec2) throws AmazonClientException { List<String> groupIds = new ArrayList<String>(); DescribeSecurityGroupsResult groupResult = getSecurityGroupsBy("group-name", securityGroupSet, ec2); if (groupResult.getSecurityGroups().size() == 0) { groupResult = getSecurityGroupsBy("group-id", securityGroupSet, ec2); } for (SecurityGroup group : groupResult.getSecurityGroups()) { if (group.getVpcId() != null && !group.getVpcId().isEmpty()) { List<Filter> filters = new ArrayList<Filter>(); filters.add(new Filter("vpc-id").withValues(group.getVpcId())); filters.add(new Filter("state").withValues("available")); filters.add(new Filter("subnet-id").withValues(getCurrentSubnetId())); DescribeSubnetsRequest subnetReq = new DescribeSubnetsRequest(); subnetReq.withFilters(filters); DescribeSubnetsResult subnetResult = ec2.describeSubnets(subnetReq); List<Subnet> subnets = subnetResult.getSubnets(); if (subnets != null && !subnets.isEmpty()) { groupIds.add(group.getGroupId()); } } } if (securityGroupSet.size() != groupIds.size()) { throw new AmazonClientException("Security groups must all be VPC security groups to work in a VPC context"); } return groupIds; }
private DescribeSecurityGroupsResult getSecurityGroupsBy(String filterName, Set<String> filterValues, AmazonEC2 ec2) { DescribeSecurityGroupsRequest groupReq = new DescribeSecurityGroupsRequest(); groupReq.withFilters(new Filter(filterName).withValues(filterValues)); return ec2.describeSecurityGroups(groupReq); }
private DescribeSecurityGroupsResult getSecurityGroupsBy(String filterName, Set<String> filterValues, AmazonEC2 ec2) { DescribeSecurityGroupsRequest group_req = new DescribeSecurityGroupsRequest(); group_req.withFilters(new Filter(filterName).withValues(filterValues)); return ec2.describeSecurityGroups(group_req); }
/** * Builds a describe instance request. * @return Request. */ private DescribeInstancesRequest request( final String tag, final String value ) { final Filter filter = new Filter() .withName(tag) .withValues(value); return new DescribeInstancesRequest().withFilters(filter); } }
private List<RouteTable> fetchRouteTables(final List<Filter> subnetIdFilters, final AmazonEC2Client amazonEC2Client, final Instance instance) { subnetIdFilters.add( new Filter().withName("association.subnet-id") .withValues(instance.getSubnetId())); // filter by subnetId final DescribeRouteTablesRequest describeRouteTablesRequest = new DescribeRouteTablesRequest() .withFilters(subnetIdFilters); final DescribeRouteTablesResult describeRouteTablesResult = amazonEC2Client .describeRouteTables(describeRouteTablesRequest); return describeRouteTablesResult.getRouteTables(); }
/*** * Get list of EC2 {@link Instance}s for a auto scaling group * * @param groupName Auto scaling group name * @param status Instance status (eg. running) * @return List of EC2 instances found for the input auto scaling group */ public List<Instance> getInstancesForGroup(String groupName, String status) { final AmazonEC2 amazonEC2 = getEc2Client(); final DescribeInstancesResult instancesResult = amazonEC2.describeInstances(new DescribeInstancesRequest() .withFilters(new Filter().withName("tag:aws:autoscaling:groupName").withValues(groupName))); final List<Instance> instances = new ArrayList<>(); for (Reservation reservation : instancesResult.getReservations()) { for (Instance instance : reservation.getInstances()) { if (null == status|| null == instance.getState() || status.equals(instance.getState().getName())) { instances.add(instance); LOGGER.info("Found instance: " + instance + " which qualified filter: " + status); } else { LOGGER.info("Found instance: " + instance + " but did not qualify for filter: " + status); } } } return instances; }
private void tagInstancesForJob(String jobFlowId) { DescribeInstancesResult r=ec2Client.describeInstances( new DescribeInstancesRequest().withFilters( new Filter().withName("tag:aws:elasticmapreduce:job-flow-id").withValues(jobFlowId) ) ); List<String> clusterInstances=newArrayList(); for(Reservation that:r.getReservations()) { for(Instance i:that.getInstances()) { logger.info("Adding monitoring for instance " + i.getInstanceId()); clusterInstances.add(i.getInstanceId()); } } ec2Client.monitorInstances(new MonitorInstancesRequest(clusterInstances)); };
@Override public void doWork() { log.info("Running " + AutomationReaperTask.NAME); DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest(); Filter filter = new Filter("tag:LaunchSource"); filter.withValues("SeleniumGridScalerPlugin"); describeInstancesRequest.withFilters(filter); List<Reservation> reservations = ec2.describeInstances(describeInstancesRequest); for(Reservation reservation : reservations) { for(Instance instance : reservation.getInstances()) { // Look for orphaned nodes Date threshold = AutomationUtils.modifyDate(new Date(),-30, Calendar.MINUTE); String instanceId = instance.getInstanceId(); // If we found a node old enough AND we're not internally tracking it, this means this is an orphaned node and we should terminate it if(threshold.after(instance.getLaunchTime()) && !AutomationContext.getContext().nodeExists(instanceId)) { log.info("Terminating orphaned node: " + instanceId); ec2.terminateInstance(instanceId); } } } }
/** * * @param interfaceIds * @param vpcId * @param ec2Client * @return */ public List<NetworkInterface> getNetworkInterfaces(List<String> interfaceIds, String vpcId, AmazonEC2 ec2Client) { DescribeNetworkInterfacesRequest request = new DescribeNetworkInterfacesRequest(); if (interfaceIds != null) { request = request.withNetworkInterfaceIds(interfaceIds); } if (vpcId != null && !vpcId.equals("")) { Filter vpcFilter = new Filter().withName("vpc-id").withValues(vpcId); request = request.withFilters(vpcFilter); } DescribeNetworkInterfacesResult result = ec2Client.describeNetworkInterfaces(request); return result.getNetworkInterfaces(); }
protected String getVpcGroupId() { AmazonEC2 client = null; try { client = getEc2Client(); Filter nameFilter = new Filter().withName("group-name").withValues(envVariables.getDynomiteClusterName()); // SG Filter vpcFilter = new Filter().withName("vpc-id").withValues(retriever.getVpcId()); logger.info("Dynomite name: " + envVariables.getDynomiteClusterName()); DescribeSecurityGroupsRequest req = new DescribeSecurityGroupsRequest().withFilters(nameFilter, vpcFilter); DescribeSecurityGroupsResult result = client.describeSecurityGroups(req); for (SecurityGroup group : result.getSecurityGroups()) { logger.debug(String.format("got group-id:%s for group-name:%s,vpc-id:%s", group.getGroupId(), envVariables.getDynomiteClusterName(), retriever.getVpcId())); return group.getGroupId(); } logger.error(String.format("unable to get group-id for group-name=%s vpc-id=%s", envVariables.getDynomiteClusterName(), retriever.getVpcId())); return ""; } finally { if (client != null) client.shutdown(); } }