@Override public InstanceAttribute getInstanceAttribute(String instanceId, String attributeName) { OperationStats ops = new OperationStats("es2InstanceStore", "getInstanceAttribute"); try { awsRateLimiter.acquire(); DescribeInstanceAttributeRequest request = new DescribeInstanceAttributeRequest() .withInstanceId(instanceId) .withAttribute(InstanceAttributeName.fromValue(attributeName)) .withSdkRequestTimeout(300 * 1000).withSdkClientExecutionTimeout(600 * 1000); DescribeInstanceAttributeResult result = defaultClient.describeInstanceAttribute(request); while (result != null) { ops.succeed(); return result.getInstanceAttribute(); } } catch (Exception ex) { ops.failed(); throw ex; } return null; }
/** * Retrieves an instance attribute. * * @param instanceId instance ID * @param attribute name of attribute to describe * @return attribute */ @VisibleForTesting InstanceAttribute describeInstanceAttribute(String instanceId, InstanceAttributeName attribute) { DescribeInstanceAttributeRequest request = new DescribeInstanceAttributeRequest() .withInstanceId(instanceId) .withAttribute(attribute); return client.describeInstanceAttribute(request).getInstanceAttribute(); }
/** * Adds the security groups to an EC2 instance. * * @param ec2InstanceId the ec2 instance id. * @param securityGroups security groups to be added. * @param awsParams awsParamsDto object * * @return updated security groups. */ @Override public List<String> addSecurityGroupsToEc2Instance(String ec2InstanceId, List<String> securityGroups, AwsParamsDto awsParams) { Set<String> updatedSecurityGroups = new HashSet<>(); for (String securityGroup : securityGroups) { updatedSecurityGroups.add(securityGroup); } // Get existing security groups DescribeInstanceAttributeRequest describeInstanceAttributeRequest = new DescribeInstanceAttributeRequest().withInstanceId(ec2InstanceId).withAttribute(InstanceAttributeName.GroupSet); DescribeInstanceAttributeResult describeInstanceAttributeResult = ec2Operations.describeInstanceAttribute(getEc2Client(awsParams), describeInstanceAttributeRequest); List<GroupIdentifier> groups = describeInstanceAttributeResult.getInstanceAttribute().getGroups(); for (GroupIdentifier groupIdentifier : groups) { updatedSecurityGroups.add(groupIdentifier.getGroupId()); } // Add security group on master EC2 instance ModifyInstanceAttributeRequest modifyInstanceAttributeRequest = new ModifyInstanceAttributeRequest().withInstanceId(ec2InstanceId).withGroups(updatedSecurityGroups); ec2Operations.modifyInstanceAttribute(getEc2Client(awsParams), modifyInstanceAttributeRequest); return new ArrayList<>(updatedSecurityGroups); }
/** * Describe the EC2 instance attribute */ @Override public DescribeInstanceAttributeResult describeInstanceAttribute(AmazonEC2Client ec2Client, DescribeInstanceAttributeRequest describeInstanceAttributeRequest) { return ec2Client.describeInstanceAttribute(describeInstanceAttributeRequest); }
@Override public DescribeInstanceAttributeResult describeInstanceAttribute(AmazonEC2Client ec2Client, DescribeInstanceAttributeRequest describeInstanceAttributeRequest) { InstanceAttribute instanceAttribute = new InstanceAttribute(); instanceAttribute.withGroups(new GroupIdentifier().withGroupId("A_TEST_SECURITY_GROUP")); return new DescribeInstanceAttributeResult().withInstanceAttribute(instanceAttribute); }
@Override public Optional<TaupageYaml> getTaupageYaml(final String instanceId, final String account, final String region) { final AmazonEC2Client client = clientProvider.getClient(AmazonEC2Client.class, account, Region.getRegion(Regions.fromName(region))); try { final DescribeInstanceAttributeResult response = client.describeInstanceAttribute( new DescribeInstanceAttributeRequest() .withInstanceId(instanceId) .withAttribute(USER_DATA)); return ofNullable(response) .map(DescribeInstanceAttributeResult::getInstanceAttribute) .map(InstanceAttribute::getUserData) .map(Base64::decode) .map(String::new) .map(TaupageYamlUtil::parseTaupageYaml); } catch (final AmazonClientException e) { log.warn("Could not get Taupage YAML for instance: " + instanceId, e); return empty(); } catch (YAMLException | IllegalArgumentException s) { log.warn("Taupage YAML is not valid for instance: " + instanceId, s); return empty(); } }
private Optional<TaupageYaml> getTaupageYaml(@Nonnull final EC2InstanceContext context) { if (context.isTaupageAmi().orElse(false)) { final String instanceId = context.getInstanceId(); try { return Optional.of(context.getClient(AmazonEC2Client.class)) .map(client -> client.describeInstanceAttribute(new DescribeInstanceAttributeRequest() .withInstanceId(instanceId) .withAttribute(USER_DATA))) .map(DescribeInstanceAttributeResult::getInstanceAttribute) .map(InstanceAttribute::getUserData) .map(Base64::decode) .map(String::new) .map(TaupageYamlUtil::parseTaupageYaml); } catch (final AmazonClientException e) { log.warn("Could not get Taupage YAML for instance: " + instanceId, e); return empty(); } catch (YAMLException | IllegalArgumentException s) { log.warn("Taupage YAML is not valid for instance: " + instanceId, s); return empty(); } } else { return empty(); } }
@Override public DescribeInstanceAttributeResult describeAttribute( DescribeInstanceAttributeRequest request, ResultCapture<DescribeInstanceAttributeResult> extractor) { ActionResult result = resource.performAction("DescribeAttribute", request, extractor); if (result == null) return null; return (DescribeInstanceAttributeResult) result.getData(); }
@Override public DescribeInstanceAttributeResult describeAttribute(String attribute, ResultCapture<DescribeInstanceAttributeResult> extractor) { DescribeInstanceAttributeRequest request = new DescribeInstanceAttributeRequest() .withAttribute(attribute); return describeAttribute(request, extractor); }
@Override public Boolean findTerminationProtection(Account account, Region region, String instanceId) { AmazonEC2 ec2 = findClient(account, region); DescribeInstanceAttributeRequest req = new DescribeInstanceAttributeRequest(); req.setAttribute("disableApiTermination"); req.setInstanceId(instanceId); log.debug("start describing instance termination protection for account:{} in region:{} via api", account.getId() + "=>" + account.getName(), region); DescribeInstanceAttributeResult res = ec2.describeInstanceAttribute(req); return res.getInstanceAttribute().getDisableApiTermination(); }
@Override public String findShutdownBehavior(Account account, Region region, String instanceId) { AmazonEC2 ec2 = findClient(account, region); DescribeInstanceAttributeRequest req = new DescribeInstanceAttributeRequest(); req.setAttribute("instanceInitiatedShutdownBehavior"); req.setInstanceId(instanceId); log.debug("start describing instance shutdown behavior for account:{} in region:{} via api", account.getId() + "=>" + account.getName(), region); DescribeInstanceAttributeResult res = ec2.describeInstanceAttribute(req); return res.getInstanceAttribute().getInstanceInitiatedShutdownBehavior(); }
@Override public String findUserData(Account account, Region region, String instanceId) { AmazonEC2 ec2 = findClient(account, region); DescribeInstanceAttributeRequest req = new DescribeInstanceAttributeRequest(); req.setAttribute("userData"); req.setInstanceId(instanceId); log.debug("start describing instance user data for account:{} in region:{} via api", account.getId() + "=>" + account.getName(), region); DescribeInstanceAttributeResult res = ec2.describeInstanceAttribute(req); return res.getInstanceAttribute().getUserData(); }
@Override public DescribeInstanceAttributeResult describeInstanceAttribute(DescribeInstanceAttributeRequest describeInstanceAttributeRequest) throws AmazonServiceException, AmazonClientException { throw new UnsupportedOperationException("Not supported in mock"); }
/** * Adds a delete on termination flag to all volumes in an {@code InstanceEbsVolumes} list * that have the ATTACHED status. This makes sure that the volumes associated with the * instance will be automatically cleaned up upon instance termination. * * @param instanceEbsVolumesList list of instances along with their associated volumes */ public void addDeleteOnTerminationFlag(List<InstanceEbsVolumes> instanceEbsVolumesList) { Set<String> volumesToFlag = getAllVolumeIdsWithStatus(instanceEbsVolumesList, InstanceEbsVolumes.Status.ATTACHED); if (!volumesToFlag.isEmpty()) { for (InstanceEbsVolumes instanceEbsVolumes : instanceEbsVolumesList) { String ec2InstanceId = instanceEbsVolumes.getEc2InstanceId(); DescribeInstanceAttributeRequest instanceAttributeRequest = new DescribeInstanceAttributeRequest() .withAttribute(InstanceAttributeName.BlockDeviceMapping) .withInstanceId(ec2InstanceId); List<InstanceBlockDeviceMapping> blockDeviceMappings = client.describeInstanceAttribute(instanceAttributeRequest) .getInstanceAttribute() .getBlockDeviceMappings(); for (InstanceBlockDeviceMapping blockDeviceMapping : blockDeviceMappings) { String volumeId = blockDeviceMapping.getEbs().getVolumeId(); // The block device mapping may have volumes associated with it that were not // provisioned by us. We skip marking those volumes for deletion. if (!volumesToFlag.contains(volumeId)) { continue; } InstanceBlockDeviceMappingSpecification updatedSpec = new InstanceBlockDeviceMappingSpecification() .withEbs( new EbsInstanceBlockDeviceSpecification() .withDeleteOnTermination(true) .withVolumeId(volumeId) ) .withDeviceName(blockDeviceMapping.getDeviceName()); ModifyInstanceAttributeRequest modifyRequest = new ModifyInstanceAttributeRequest() .withBlockDeviceMappings(updatedSpec) .withInstanceId(ec2InstanceId); client.modifyInstanceAttribute(modifyRequest); } } } }
private VirtualMachine toExcaliburInstance(Instance instance, KeyPair keyPair) { Map<String, Tag> tags = TAGS.apply(instance.getTags()); VirtualMachine vm = new VirtualMachine() .setName(instance.getInstanceId()) .setImageId(instance.getImageId()) .setType(InstanceType.valueOf(instance.getInstanceType()).setProvider(this.credentials_.getProvider())) .setState(new InstanceStateDetails(InstanceStateType.valueOfFrom(instance.getState().getName()), new Date())) //TODO we need to improve this .setConfiguration( new VmConfiguration() .setKeyName(instance.getKeyName()) .setKeyPairs(new KeyPairs().setPrivateKey(keyPair)) .setPlatform(isNullOrEmpty(instance.getPlatform()) ? DEFAULT_PLATFORM : instance.getPlatform()) .setPlatformUserName(tags.get(DEFAULT_PLATFORM_INSTANCE_USERNAME_TAG) != null ? tags.get(DEFAULT_PLATFORM_INSTANCE_USERNAME_TAG).getValue() : System.getProperty("org.excalibur.default.platform.username")) .setPrivateIpAddress(instance.getPrivateIpAddress()).setPublicIpAddress(instance.getPublicIpAddress()) .setPublicDnsName(instance.getPublicDnsName())).setLaunchTime(instance.getLaunchTime()) // .setLocation(new Region().setName(instance.getPlacement().getAvailabilityZone())) // .setLocation(credentials_.getRegion()) .setLocation(new Zone().setName(instance.getPlacement().getAvailabilityZone()).setRegion(credentials_.getRegion())) .setPlacement(new org.excalibur.core.cloud.api.Placement() .setGroupName(instance.getPlacement().getGroupName()) .setZone(instance.getPlacement().getAvailabilityZone())) .setOwner(new User(this.credentials_.getUserId()).setUsername(tags.get("username") != null ? tags.get("username").getValue(): null)); if (tags.containsKey("keyname")) { if (vm.getConfiguration().getKeyPairs().getPrivateKey() == null) { vm.getConfiguration().getKeyPairs().setPrivateKey(new KeyPair()); } vm.getConfiguration().getKeyPairs().getPrivateKey().setKeyName(tags.get("keyname").getValue()); } else { return null; } InstanceAttribute attribute = new AmazonEC2Client(awsCredentials_).describeInstanceAttribute( new DescribeInstanceAttributeRequest().withInstanceId(instance.getInstanceId()).withAttribute("userData")).getInstanceAttribute(); // List<InstanceStatus> instanceStatuses = new AmazonEC2Client(awsCredentials_).describeInstanceStatus( // new DescribeInstanceStatusRequest().withInstanceIds(instance.getInstanceId())).getInstanceStatuses(); if (!isNullOrEmpty(attribute.getUserData())) { String userData = new String(Base64.decodeBase64(attribute.getUserData().getBytes())); int i = userData.indexOf("#start-data"), f = userData.indexOf("#end-data"); if (i > -1 && f > -1) { String[] keys = userData.substring(i, f).split("#"); checkState(keys.length == 4); vm.getConfiguration().getKeyPairs().getPrivateKey().setKeyMaterial(keys[2]); vm.getConfiguration().getKeyPairs() .setPublicKey(new KeyPair().setKeyName(tags.get("keyname").getValue()).setKeyMaterial(keys[3].trim())); } vm.setUserData(attribute.getUserData()); } for (Tag tag: tags.values()) { vm.getTags().add(org.excalibur.core.cloud.api.domain.Tag.valueOf(tag.getKey(), tag.getValue())); } return vm; }
@Override public DescribeInstanceAttributeResult describeAttribute( DescribeInstanceAttributeRequest request) { return describeAttribute(request, null); }
/** * {@link AmazonEC2#describeInstanceAttribute(DescribeInstanceAttributeRequest)} * * @param ec2Client {@link AmazonEC2} to use. * @param describeInstanceAttributeRequest The request object. * @return {@link DescribeInstanceAttributeResult} */ public DescribeInstanceAttributeResult describeInstanceAttribute(AmazonEC2Client ec2Client, DescribeInstanceAttributeRequest describeInstanceAttributeRequest);
/** * Performs the <code>DescribeAttribute</code> action. * * <p> * The following request parameters will be populated from the data of this * <code>Instance</code> resource, and any conflicting parameter value set * in the request will be overridden: * <ul> * <li> * <b><code>InstanceId</code></b> * - mapped from the <code>Id</code> identifier. * </li> * </ul> * * <p> * * @return The response of the low-level client operation associated with * this resource action. * @see DescribeInstanceAttributeRequest */ DescribeInstanceAttributeResult describeAttribute( DescribeInstanceAttributeRequest request);
/** * Performs the <code>DescribeAttribute</code> action and use a * ResultCapture to retrieve the low-level client response. * * <p> * The following request parameters will be populated from the data of this * <code>Instance</code> resource, and any conflicting parameter value set * in the request will be overridden: * <ul> * <li> * <b><code>InstanceId</code></b> * - mapped from the <code>Id</code> identifier. * </li> * </ul> * * <p> * * @return The response of the low-level client operation associated with * this resource action. * @see DescribeInstanceAttributeRequest */ DescribeInstanceAttributeResult describeAttribute( DescribeInstanceAttributeRequest request, ResultCapture<DescribeInstanceAttributeResult> extractor);