List of usage examples for com.amazonaws.services.ec2.model InstanceStatus getInstanceStatus
public InstanceStatusSummary getInstanceStatus()
Reports impaired functionality that stems from issues internal to the instance, such as impaired reachability.
From source file:com.dowdandassociates.gentoo.bootstrap.InstanceUtils.java
License:Apache License
public static Optional<Instance> onDemandInstance(AmazonEC2 ec2Client, Optional<Image> image, Integer minCount, Integer maxCount, SecurityGroupInformation securityGroupInformation, KeyPairInformation keyPairInformation, Optional<String> instanceType, Optional<String> availabilityZone, Long sleep) {//from w ww . j a va 2s .c om if (!image.isPresent()) { return Optional.absent(); } RunInstancesRequest runInstancesRequest = new RunInstancesRequest().withImageId(image.get().getImageId()) .withMinCount(minCount).withMaxCount(maxCount) .withSecurityGroups(securityGroupInformation.getGroupName()) .withKeyName(keyPairInformation.getName()); log.info("ImageId=" + image.get().getImageId()); log.info("MinCount=" + minCount); log.info("MaxCount=" + maxCount); log.info("SecurityGroups.1=" + securityGroupInformation.getGroupName()); log.info("KeyName=" + keyPairInformation.getName()); if (instanceType.isPresent()) { runInstancesRequest.setInstanceType(instanceType.get()); log.info("InstanceType=" + instanceType.get()); } if (availabilityZone.isPresent()) { runInstancesRequest.setPlacement(new Placement().withAvailabilityZone(availabilityZone.get())); log.info("Placement.AvailabilityZone=" + availabilityZone.get()); } RunInstancesResult runInstancesResult = ec2Client.runInstances(runInstancesRequest); DescribeInstanceStatusRequest describeInstanceStatusRequest = new DescribeInstanceStatusRequest() .withInstanceIds(runInstancesResult.getReservation().getInstances().get(0).getInstanceId()); try { while (true) { log.info("Sleeping for " + sleep + " ms"); Thread.sleep(sleep); DescribeInstanceStatusResult describeInstanceStatusResult = ec2Client .describeInstanceStatus(describeInstanceStatusRequest); if (describeInstanceStatusResult.getInstanceStatuses().isEmpty()) { continue; } InstanceStatus instance = describeInstanceStatusResult.getInstanceStatuses().get(0); String instanceState = instance.getInstanceState().getName(); log.info("instanceState = " + instanceState); if ("pending".equals(instanceState)) { continue; } if (!"running".equals(instanceState)) { return Optional.absent(); } String instanceStatus = instance.getInstanceStatus().getStatus(); String systemStatus = instance.getSystemStatus().getStatus(); log.info("instanceStatus = " + instanceStatus); log.info("systemStatus = " + systemStatus); if ("impaired".equals(instanceStatus)) { return Optional.absent(); } if ("impaired".equals(systemStatus)) { return Optional.absent(); } if (!"ok".equals(instanceStatus)) { continue; } if (!"ok".equals(systemStatus)) { continue; } break; } } catch (InterruptedException e) { return Optional.absent(); } DescribeInstancesResult describeInstancesResult = ec2Client.describeInstances(new DescribeInstancesRequest() .withInstanceIds(runInstancesResult.getReservation().getInstances().get(0).getInstanceId())); return Optional.fromNullable(describeInstancesResult.getReservations().get(0).getInstances().get(0)); }
From source file:com.ec2box.manage.action.SystemAction.java
License:Apache License
@Action(value = "/admin/viewSystems", results = { @Result(name = "success", location = "/admin/view_systems.jsp") }) public String viewSystems() { Long userId = AuthUtil.getUserId(servletRequest.getSession()); String userType = AuthUtil.getUserType(servletRequest.getSession()); List<String> ec2RegionList = EC2KeyDB.getEC2Regions(); List<String> instanceIdList = new ArrayList<String>(); //default instance state if (sortedSet.getFilterMap().get(FILTER_BY_INSTANCE_STATE) == null) { sortedSet.getFilterMap().put(FILTER_BY_INSTANCE_STATE, AppConfig.getProperty("defaultInstanceState")); }//ww w. ja va2 s. c o m try { Map<String, HostSystem> hostSystemList = new HashMap<String, HostSystem>(); //if user profile has been set or user is a manager List<Profile> profileList = UserProfileDB.getProfilesByUser(userId); if (profileList.size() > 0 || Auth.MANAGER.equals(userType)) { //set tags for profile List<String> profileTags = new ArrayList<>(); for (Profile profile : profileList) { profileTags.add(profile.getTag()); } Map<String, List<String>> profileTagMap = parseTags(profileTags); //set tags from input filters Map<String, List<String>> filterTags = fetchInputFilterTags(userType, profileTagMap); //parse out security group list in format group[,group] List<String> securityGroupList = new ArrayList<>(); if (StringUtils.isNotEmpty(sortedSet.getFilterMap().get(FILTER_BY_SECURITY_GROUP))) { securityGroupList = Arrays .asList(sortedSet.getFilterMap().get(FILTER_BY_SECURITY_GROUP).split(",")); } //get AWS credentials from DB for (AWSCred awsCred : AWSCredDB.getAWSCredList()) { if (awsCred != null) { //set AWS credentials for service BasicAWSCredentials awsCredentials = new BasicAWSCredentials(awsCred.getAccessKey(), awsCred.getSecretKey()); for (String ec2Region : ec2RegionList) { //create service AmazonEC2 service = new AmazonEC2Client(awsCredentials, AWSClientConfig.getClientConfig()); service.setEndpoint(ec2Region); //only return systems that have keys set List<String> keyValueList = new ArrayList<String>(); for (EC2Key ec2Key : EC2KeyDB.getEC2KeyByRegion(ec2Region, awsCred.getId())) { keyValueList.add(ec2Key.getKeyNm()); } DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest(); Filter keyNmFilter = new Filter("key-name", keyValueList); describeInstancesRequest.withFilters(keyNmFilter); //instance state filter if (StringUtils.isNotEmpty(sortedSet.getFilterMap().get(FILTER_BY_INSTANCE_STATE))) { List<String> instanceStateList = new ArrayList<String>(); instanceStateList.add(sortedSet.getFilterMap().get(FILTER_BY_INSTANCE_STATE)); Filter instanceStateFilter = new Filter("instance-state-name", instanceStateList); describeInstancesRequest.withFilters(instanceStateFilter); } if (securityGroupList.size() > 0) { Filter groupFilter = new Filter("group-name", securityGroupList); describeInstancesRequest.withFilters(groupFilter); } //set name value pair for tag filter List<String> tagList = new ArrayList<String>(); //always add all profile tags to filter list addTagsToDescribeInstanceRequest(profileTagMap, describeInstancesRequest, tagList); //add all additional filter tags provided by the user addTagsToDescribeInstanceRequest(filterTags, describeInstancesRequest, tagList); if (tagList.size() > 0) { Filter tagFilter = new Filter("tag-key", tagList); describeInstancesRequest.withFilters(tagFilter); } DescribeInstancesResult describeInstancesResult = service .describeInstances(describeInstancesRequest); for (Reservation res : describeInstancesResult.getReservations()) { for (Instance instance : res.getInstances()) { HostSystem hostSystem = new HostSystem(); hostSystem.setInstance(instance.getInstanceId()); //check for public dns if doesn't exist set to ip or pvt dns if (!"true".equals(AppConfig.getProperty("useEC2PvtDNS")) && StringUtils.isNotEmpty(instance.getPublicDnsName())) { hostSystem.setHost(instance.getPublicDnsName()); } else if (!"true".equals(AppConfig.getProperty("useEC2PvtDNS")) && StringUtils.isNotEmpty(instance.getPublicIpAddress())) { hostSystem.setHost(instance.getPublicIpAddress()); } else if (StringUtils.isNotEmpty(instance.getPrivateDnsName())) { hostSystem.setHost(instance.getPrivateDnsName()); } else { hostSystem.setHost(instance.getPrivateIpAddress()); } hostSystem.setKeyId(EC2KeyDB .getEC2KeyByNmRegion(instance.getKeyName(), ec2Region, awsCred.getId()) .getId()); hostSystem.setEc2Region(ec2Region); hostSystem.setState(instance.getState().getName()); for (Tag tag : instance.getTags()) { if ("Name".equals(tag.getKey())) { hostSystem.setDisplayNm(tag.getValue()); } } instanceIdList.add(hostSystem.getInstance()); hostSystemList.put(hostSystem.getInstance(), hostSystem); } } if (instanceIdList.size() > 0) { //set instance id list to check permissions when creating sessions servletRequest.getSession().setAttribute("instanceIdList", new ArrayList<String>(instanceIdList)); if (showStatus) { //make service call 100 instances at a time b/c of AWS limitation int i = 0; List<String> idCallList = new ArrayList<String>(); while (!instanceIdList.isEmpty()) { idCallList.add(instanceIdList.remove(0)); i++; //when i eq 100 make call if (i >= 100 || instanceIdList.isEmpty()) { //get status for host systems DescribeInstanceStatusRequest describeInstanceStatusRequest = new DescribeInstanceStatusRequest(); describeInstanceStatusRequest.withInstanceIds(idCallList); DescribeInstanceStatusResult describeInstanceStatusResult = service .describeInstanceStatus(describeInstanceStatusRequest); for (InstanceStatus instanceStatus : describeInstanceStatusResult .getInstanceStatuses()) { HostSystem hostSystem = hostSystemList .remove(instanceStatus.getInstanceId()); hostSystem.setSystemStatus( instanceStatus.getSystemStatus().getStatus()); hostSystem.setInstanceStatus( instanceStatus.getInstanceStatus().getStatus()); //check and filter by instance or system status if ((StringUtils.isEmpty( sortedSet.getFilterMap().get(FILTER_BY_INSTANCE_STATUS)) && StringUtils.isEmpty(sortedSet.getFilterMap() .get(FILTER_BY_SYSTEM_STATUS))) || (hostSystem.getInstanceStatus() .equals(sortedSet.getFilterMap() .get(FILTER_BY_INSTANCE_STATUS)) && StringUtils.isEmpty(sortedSet.getFilterMap() .get(FILTER_BY_SYSTEM_STATUS))) || (hostSystem.getInstanceStatus() .equals(sortedSet.getFilterMap() .get(FILTER_BY_SYSTEM_STATUS)) && StringUtils.isEmpty(sortedSet.getFilterMap() .get(FILTER_BY_INSTANCE_STATUS))) || (hostSystem.getInstanceStatus() .equals(sortedSet.getFilterMap() .get(FILTER_BY_SYSTEM_STATUS)) && hostSystem.getInstanceStatus() .equals(sortedSet.getFilterMap() .get(FILTER_BY_INSTANCE_STATUS)))) { hostSystemList.put(hostSystem.getInstance(), hostSystem); } } //start over i = 0; //clear list idCallList.clear(); } } //check alarms for ec2 instances AmazonCloudWatchClient cloudWatchClient = new AmazonCloudWatchClient( awsCredentials, AWSClientConfig.getClientConfig()); cloudWatchClient.setEndpoint(ec2Region.replace("ec2", "monitoring")); DescribeAlarmsResult describeAlarmsResult = cloudWatchClient.describeAlarms(); for (MetricAlarm metricAlarm : describeAlarmsResult.getMetricAlarms()) { for (Dimension dim : metricAlarm.getDimensions()) { if (dim.getName().equals("InstanceId")) { HostSystem hostSystem = hostSystemList.remove(dim.getValue()); if (hostSystem != null) { if ("ALARM".equals(metricAlarm.getStateValue())) { hostSystem .setMonitorAlarm(hostSystem.getMonitorAlarm() + 1); } else if ("INSUFFICIENT_DATA" .equals(metricAlarm.getStateValue())) { hostSystem.setMonitorInsufficientData( hostSystem.getMonitorInsufficientData() + 1); } else { hostSystem.setMonitorOk(hostSystem.getMonitorOk() + 1); } //check and filter by alarm state if (StringUtils.isEmpty( sortedSet.getFilterMap().get(FILTER_BY_ALARM_STATE))) { hostSystemList.put(hostSystem.getInstance(), hostSystem); } else if ("ALARM".equals( sortedSet.getFilterMap().get(FILTER_BY_ALARM_STATE)) && hostSystem.getMonitorAlarm() > 0) { hostSystemList.put(hostSystem.getInstance(), hostSystem); } else if ("INSUFFICIENT_DATA".equals( sortedSet.getFilterMap().get(FILTER_BY_ALARM_STATE)) && hostSystem.getMonitorInsufficientData() > 0) { hostSystemList.put(hostSystem.getInstance(), hostSystem); } else if ("OK".equals( sortedSet.getFilterMap().get(FILTER_BY_ALARM_STATE)) && hostSystem.getMonitorOk() > 0 && hostSystem.getMonitorInsufficientData() <= 0 && hostSystem.getMonitorAlarm() <= 0) { hostSystemList.put(hostSystem.getInstance(), hostSystem); } } } } } } } } } } //set ec2 systems SystemDB.setSystems(hostSystemList.values()); sortedSet = SystemDB.getSystemSet(sortedSet, new ArrayList<String>(hostSystemList.keySet())); } } catch (AmazonServiceException ex) { log.error(ex.toString(), ex); } if (script != null && script.getId() != null) { script = ScriptDB.getScript(script.getId(), userId); } return SUCCESS; }
From source file:de.unibi.cebitec.bibigrid.meta.aws.CreateClusterAWS.java
@Override public boolean launchClusterInstances() { log.info("Requesting master instance ..."); if (config.isUseSpotInstances()) { RequestSpotInstancesRequest masterReq = new RequestSpotInstancesRequest(); masterReq.withType(SpotInstanceType.OneTime).withInstanceCount(1).withLaunchGroup("lg_" + clusterId) .withSpotPrice(Double.toString(config.getBidPriceMaster())); LaunchSpecification masterLaunchSpecification = new LaunchSpecification(); masterLaunchSpecification/*from www .ja v a 2 s. c o m*/ .withInstanceType(InstanceType.fromValue(this.config.getMasterInstanceType().getValue())) .withPlacement(spotInstancePlacement).withKeyName(this.config.getKeypair()) .withImageId(this.config.getMasterImage()).withUserData(base64MasterUserData) .withBlockDeviceMappings(masterDeviceMappings).withNetworkInterfaces(masterNetworkInterfaces); masterReq.setLaunchSpecification(masterLaunchSpecification); RequestSpotInstancesResult masterReqResult = ec2.requestSpotInstances(masterReq); List<SpotInstanceRequest> masterReqResponses = masterReqResult.getSpotInstanceRequests(); // collect all spotInstanceRequestIds ... List<String> spotInstanceRequestIds = new ArrayList<>(); for (SpotInstanceRequest requestResponse : masterReqResponses) { spotInstanceRequestIds.add(requestResponse.getSpotInstanceRequestId()); } // Tag spotrequest CreateTagsRequest ctr = new CreateTagsRequest(); ctr.withResources(spotInstanceRequestIds); ctr.withTags(bibigridid, username, new Tag().withKey("Name").withValue(PREFIX + "master-" + clusterId)); ec2.createTags(ctr); // Wait for spot request finished log.info("Waiting for master instance (spot request) to finish booting ..."); masterInstance = waitForInstances(waitForSpotInstances(spotInstanceRequestIds)).get(0); } else { RunInstancesRequest masterReq = new RunInstancesRequest(); masterReq.withInstanceType(InstanceType.fromValue(this.config.getMasterInstanceType().getValue())) .withMinCount(1).withMaxCount(1).withPlacement(instancePlacement) .withKeyName(this.config.getKeypair()).withImageId(this.config.getMasterImage()) .withUserData(base64MasterUserData).withBlockDeviceMappings(masterDeviceMappings) .withNetworkInterfaces(masterNetworkInterfaces); // mounting ephemerals RunInstancesResult masterReqResult = ec2.runInstances(masterReq); String masterReservationId = masterReqResult.getReservation().getReservationId(); masterInstance = masterReqResult.getReservation().getInstances().get(0); log.info("Waiting for master instance to finish booting ..."); ///////////////////////////////////////////// //// Waiting for master instance to run //// masterInstance = waitForInstances(Arrays.asList(new String[] { masterInstance.getInstanceId() })) .get(0); } log.info(I, "Master instance is now running!"); ModifyInstanceAttributeRequest ia_req = new ModifyInstanceAttributeRequest(); ia_req.setInstanceId(masterInstance.getInstanceId()); ia_req.setSourceDestCheck(Boolean.FALSE); ec2.modifyInstanceAttribute(ia_req); //////////////////////////////////// //// Tagging Master with a name //// CreateTagsRequest masterNameTagRequest = new CreateTagsRequest(); masterNameTagRequest.withResources(masterInstance.getInstanceId()).withTags(bibigridid, username, new Tag().withKey("Name").withValue(PREFIX + "master-" + clusterId)); ec2.createTags(masterNameTagRequest); /* * Waiting for Status Checks to finish * */ log.info("Waiting for Status Checks on master ..."); do { DescribeInstanceStatusRequest request = new DescribeInstanceStatusRequest(); request.setInstanceIds((Arrays.asList(new String[] { masterInstance.getInstanceId() }))); DescribeInstanceStatusResult response = ec2.describeInstanceStatus(request); InstanceStatus status = response.getInstanceStatuses().get(0); String instanceStatus = status.getInstanceStatus().getStatus(); String systemStatus = status.getSystemStatus().getStatus(); log.debug("Status of master instance: " + instanceStatus + "," + systemStatus); if (instanceStatus.equalsIgnoreCase("ok") && systemStatus.equalsIgnoreCase("ok")) { break; } else { log.info(V, "..."); sleep(10); } } while (true); log.info(I, "Status checks successful."); //////////////////////////////////////////////////////////////////////// ///// run slave instances and supply userdata ////////////////////////// if (config.getSlaveInstanceCount() > 0) { String base64SlaveUserData = UserDataCreator.forSlave(masterInstance.getPrivateIpAddress(), masterInstance.getPrivateDnsName(), slaveDeviceMapper, this.config, environment.getKeypair()); log.info(V, "Slave Userdata:\n{}", new String(Base64.decodeBase64(base64SlaveUserData))); if (config.isUseSpotInstances()) { RequestSpotInstancesRequest slaveReq = new RequestSpotInstancesRequest(); slaveReq.withType(SpotInstanceType.OneTime).withInstanceCount(config.getSlaveInstanceCount()) .withLaunchGroup("lg_" + clusterId).withSpotPrice(Double.toString(config.getBidPrice())); LaunchSpecification slaveLaunchSpecification = new LaunchSpecification(); slaveLaunchSpecification .withInstanceType(InstanceType.fromValue(this.config.getSlaveInstanceType().getValue())) .withPlacement(spotInstancePlacement).withKeyName(this.config.getKeypair()) .withImageId(this.config.getSlaveImage()).withUserData(base64SlaveUserData) .withBlockDeviceMappings(slaveBlockDeviceMappings) .withNetworkInterfaces(slaveNetworkInterfaces); slaveReq.setLaunchSpecification(slaveLaunchSpecification); RequestSpotInstancesResult slaveReqResult = ec2.requestSpotInstances(slaveReq); List<SpotInstanceRequest> slaveReqResponses = slaveReqResult.getSpotInstanceRequests(); // collect all spotInstanceRequestIds ... List<String> spotInstanceRequestIds = new ArrayList<>(); for (SpotInstanceRequest requestResponse : slaveReqResponses) { spotInstanceRequestIds.add(requestResponse.getSpotInstanceRequestId()); } // wait for a second try { Thread.sleep(1000); } catch (InterruptedException e) { } log.info(V, "tag spot request instances"); // tag spot requests (slave) CreateTagsRequest ctr = new CreateTagsRequest(); ctr.withResources(spotInstanceRequestIds); ctr.withTags(bibigridid, username, new Tag().withKey("Name").withValue(PREFIX + "slave-" + clusterId)); /* Setting tags for spot requests can cause an amazon service exception, if the spot request returns an id, but the id isn't registered in spot request registy yet. */ int counter = 0; boolean finished = false; while (!finished) { try { ec2.createTags(ctr); finished = true; } catch (AmazonServiceException ase) { if (counter < 5) { log.warn("{} ... try again in 10 seconds.", ase.getMessage()); try { Thread.sleep(10000); } catch (InterruptedException e) { } counter++; } else { throw ase; } } } log.info("Waiting for slave instance(s) (spot request) to finish booting ..."); // wait for spot request (slave) finished slaveInstances = waitForInstances(waitForSpotInstances(spotInstanceRequestIds)); } else { RunInstancesRequest slaveReq = new RunInstancesRequest(); slaveReq.withInstanceType(InstanceType.fromValue(this.config.getSlaveInstanceType().getValue())) .withMinCount(this.config.getSlaveInstanceCount()) .withMaxCount(this.config.getSlaveInstanceCount()).withPlacement(instancePlacement) .withKeyName(this.config.getKeypair()).withImageId(this.config.getSlaveImage()) .withUserData(base64SlaveUserData).withBlockDeviceMappings(slaveBlockDeviceMappings) .withNetworkInterfaces(slaveNetworkInterfaces); RunInstancesResult slaveReqResult = ec2.runInstances(slaveReq); String slaveReservationId = slaveReqResult.getReservation().getReservationId(); // create a list of all slave instances List<String> slaveInstanceListIds = new ArrayList<>(); for (Instance i : slaveReqResult.getReservation().getInstances()) { slaveInstanceListIds.add(i.getInstanceId()); } log.info("Waiting for slave instance(s) to finish booting ..."); slaveInstances = waitForInstances(slaveInstanceListIds); } ///////////////////////////////////////////// //// Waiting for master instance to run //// log.info(I, "Slave instance(s) is now running!"); //////////////////////////////////// //// Tagging all slaves with a name for (Instance si : slaveInstances) { CreateTagsRequest slaveNameTagRequest = new CreateTagsRequest(); slaveNameTagRequest.withResources(si.getInstanceId()).withTags(bibigridid, username, new Tag().withKey("Name").withValue(PREFIX + "slave-" + clusterId)); ec2.createTags(slaveNameTagRequest); } } else { log.info("No Slave instance(s) requested !"); } ////////////////////////////////// ////// post configure master configureMaster(); //////////////////////////////////// //// Human friendly output StringBuilder sb = new StringBuilder(); sb.append("\n You might want to set the following environment variable:\n\n"); sb.append("export BIBIGRID_MASTER=").append(masterInstance.getPublicIpAddress()).append("\n\n"); sb.append("You can then log on the master node with:\n\n").append("ssh -i ") .append(config.getIdentityFile()).append(" ubuntu@$BIBIGRID_MASTER\n\n"); sb.append("The cluster id of your started cluster is : ").append(clusterId).append("\n\n"); sb.append("The can easily terminate the cluster at any time with :\n").append("./bibigrid -t ") .append(clusterId).append(" "); if (getConfig().isAlternativeConfigFile()) { sb.append("-o ").append(config.getAlternativeConfigPath()).append(" "); } sb.append("\n"); log.info(sb.toString()); //////////////////////////////////// //// Grid Properties file if (getConfig().getGridPropertiesFile() != null) { Properties gp = new Properties(); gp.setProperty("BIBIGRID_MASTER", masterInstance.getPublicIpAddress()); gp.setProperty("IdentityFile", getConfig().getIdentityFile().toString()); gp.setProperty("clusterId", clusterId); if (getConfig().isAlternativeConfigFile()) { gp.setProperty("AlternativeConfigFile", config.getAlternativeConfigPath()); } try { gp.store(new FileOutputStream(getConfig().getGridPropertiesFile()), "Autogenerated by BiBiGrid"); } catch (IOException e) { log.error(I, "Exception while creating grid properties file : " + e.getMessage()); } } return true; }