use of com.amazonaws.services.ec2.model.InstanceType in project photon-model by vmware.
the class AWSInstanceContext method getInstanceTypeInfo.
private DeferredResult<AWSInstanceContext> getInstanceTypeInfo(AWSInstanceContext context) {
String instanceType = context.child.description.instanceType;
if (instanceType == null) {
instanceType = context.child.description.name;
}
if (instanceType == null) {
String msg = String.format("AWS Instance type not specified for [%s] VM.", context.child.name);
return DeferredResult.failed(new IllegalStateException(msg));
}
URI instanceTypeServiceURI = UriUtils.buildUri(context.service.getHost(), AWSInstanceTypeService.SELF_LINK);
instanceTypeServiceURI = UriUtils.appendQueryParam(instanceTypeServiceURI, URI_PARAM_ENDPOINT, context.child.endpointLink);
instanceTypeServiceURI = UriUtils.appendQueryParam(instanceTypeServiceURI, URI_PARAM_INSTANCE_TYPE, instanceType);
Operation op = Operation.createGet(instanceTypeServiceURI).setReferer(context.service.getHost().getUri());
DeferredResult<InstanceType> dr = context.service.sendWithDeferredResult(op, InstanceType.class);
return dr.thenAccept(type -> {
context.instanceTypeInfo = type;
}).handle((all, err) -> {
if (err != null) {
String msg = String.format("Error getting instance-type info for [%s] VM. Reason [%s]", context.child.name, err.getMessage());
throw new IllegalStateException(msg, err);
}
return context;
});
}
use of com.amazonaws.services.ec2.model.InstanceType in project photon-model by vmware.
the class AWSInstanceService method createInstanceStoreMappings.
/**
* Creates device mappings for the instance-store disks.
*/
private List<BlockDeviceMapping> createInstanceStoreMappings(List<DiskState> instanceStoreDisks, List<String> usedDeviceNames, List<String> usedVirtualNames, String instanceType, Integer capacityMBytes, String platform, String virtualizationType) {
List<BlockDeviceMapping> deviceMappings = new ArrayList<>();
if (!instanceStoreDisks.isEmpty()) {
this.logInfo(() -> String.format("[AWSInstanceService] Ignores the size and type of the " + "additional disk. Instance-store type of additional disks are " + "provisioned with the capacity supported by %s", instanceType));
List<String> availableDeviceNames = AWSBlockDeviceNameMapper.getAvailableNames(AWSSupportedOS.get(platform), AWSSupportedVirtualizationTypes.get(virtualizationType), AWSStorageType.INSTANCE_STORE, instanceType, usedDeviceNames);
List<String> availableVirtualNames = getAvailableVirtualNames(usedVirtualNames);
if (availableDeviceNames.size() >= instanceStoreDisks.size() && availableVirtualNames.size() >= instanceStoreDisks.size()) {
for (DiskState diskState : instanceStoreDisks) {
BlockDeviceMapping blockDeviceMapping = new BlockDeviceMapping();
String deviceName = availableDeviceNames.get(0);
blockDeviceMapping.setDeviceName(deviceName);
availableDeviceNames.remove(0);
usedDeviceNames.add(deviceName);
String virtualName = availableVirtualNames.get(0);
blockDeviceMapping.setVirtualName(virtualName);
availableVirtualNames.remove(0);
deviceMappings.add(blockDeviceMapping);
if (diskState.customProperties == null) {
diskState.customProperties = new HashMap<>();
}
diskState.customProperties.put(DEVICE_NAME, deviceName);
diskState.customProperties.put(DEVICE_TYPE, AWSStorageType.INSTANCE_STORE.getName());
diskState.capacityMBytes = capacityMBytes;
}
} else {
String message = "Additional instance-store disks cannot be attached. " + "Not sufficient device names are available.";
this.logWarning(() -> "[AWSInstanceService] " + message);
throw new IllegalArgumentException(message);
}
}
return deviceMappings;
}
use of com.amazonaws.services.ec2.model.InstanceType in project photon-model by vmware.
the class AWSInstanceService method addMandatoryProperties.
/**
* Add the disk information to disk state so that the disk state reflects the volume
* information
*/
private void addMandatoryProperties(DiskState diskState, BlockDeviceMapping deviceMapping, AWSInstanceContext instanceType) {
if (diskState.customProperties == null) {
diskState.customProperties = new HashMap<>();
}
String deviceName = deviceMapping.getDeviceName();
diskState.customProperties.put(DEVICE_NAME, deviceName);
diskState.persistent = Boolean.FALSE;
EbsBlockDevice ebs = deviceMapping.getEbs();
if (ebs != null) {
diskState.capacityMBytes = ebs.getVolumeSize() * 1024;
diskState.customProperties.put(DEVICE_TYPE, AWSStorageType.EBS.getName());
} else {
diskState.capacityMBytes = instanceType.instanceTypeInfo.dataDiskSizeInMB;
diskState.customProperties.put(DEVICE_TYPE, AWSStorageType.INSTANCE_STORE.getName());
}
// add the endpointLinks
diskState.endpointLinks = instanceType.child.endpointLinks;
}
use of com.amazonaws.services.ec2.model.InstanceType in project photon-model by vmware.
the class AWSComputeDiskDay2Service method getAvailableDeviceName.
private String getAvailableDeviceName(DiskContext context, String instanceId) {
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest().withInstanceIds(instanceId);
DescribeInstancesResult instancesResult = context.amazonEC2Client.describeInstances(describeInstancesRequest);
List<InstanceBlockDeviceMapping> blockDeviceMappings = null;
AWSSupportedOS platform = null;
AWSSupportedVirtualizationTypes virtualizationTypes = null;
String instanceType = null;
for (Reservation reservation : instancesResult.getReservations()) {
for (Instance instance : reservation.getInstances()) {
if (instance.getInstanceId().equals(instanceId)) {
blockDeviceMappings = instance.getBlockDeviceMappings();
platform = AWSSupportedOS.get(instance.getPlatform());
virtualizationTypes = AWSSupportedVirtualizationTypes.get(instance.getVirtualizationType());
instanceType = instance.getInstanceType();
break;
}
}
}
String deviceName = null;
if (blockDeviceMappings != null) {
List<String> usedDeviceNames = getUsedDeviceNames(blockDeviceMappings);
List<String> availableDiskNames = AWSBlockDeviceNameMapper.getAvailableNames(platform, virtualizationTypes, AWSStorageType.EBS, instanceType, usedDeviceNames);
deviceName = availableDiskNames.get(0);
}
return deviceName;
}
use of com.amazonaws.services.ec2.model.InstanceType in project photon-model by vmware.
the class AWSEnumerationUtils method mapInstanceToComputeState.
/**
* Maps the instance discovered on AWS to a local compute state that will be persisted.
*/
public static ComputeState mapInstanceToComputeState(ServiceHost host, Instance instance, String parentComputeLink, String placementComputeLink, String resourcePoolLink, String existingEndpointLink, Set<String> endpointLinks, String computeDescriptionLink, Set<URI> parentCDStatsAdapterReferences, Set<String> internalTagLinks, String regionId, String zoneId, List<String> tenantLinks, List<Tag> createdExternalTags, Boolean isNewState, List<String> diskLinks) {
ComputeState computeState = new ComputeState();
computeState.id = instance.getInstanceId();
computeState.name = instance.getInstanceId();
computeState.parentLink = parentComputeLink;
computeState.computeHostLink = parentComputeLink;
computeState.type = ComputeType.VM_GUEST;
computeState.environmentName = ComputeDescription.ENVIRONMENT_NAME_AWS;
computeState.regionId = regionId;
computeState.zoneId = zoneId;
computeState.instanceType = instance.getInstanceType();
computeState.instanceAdapterReference = AdapterUriUtil.buildAdapterUri(host, AWSUriPaths.AWS_INSTANCE_ADAPTER);
computeState.enumerationAdapterReference = AdapterUriUtil.buildAdapterUri(host, AWSUriPaths.AWS_ENUMERATION_CREATION_ADAPTER);
computeState.statsAdapterReference = AdapterUriUtil.buildAdapterUri(host, AWSUriPaths.AWS_STATS_ADAPTER);
computeState.statsAdapterReferences = parentCDStatsAdapterReferences;
computeState.resourcePoolLink = resourcePoolLink;
if (computeState.endpointLinks == null) {
computeState.endpointLinks = new HashSet<>();
}
computeState.endpointLinks.addAll(endpointLinks);
// assign existing one, if exists
if (existingEndpointLink != null) {
computeState.endpointLink = existingEndpointLink;
} else {
computeState.endpointLink = endpointLinks.iterator().next();
}
// Compute descriptions are looked up by the instanceType in the local list of CDs.
computeState.descriptionLink = computeDescriptionLink;
computeState.hostName = instance.getPublicDnsName();
// TODO VSYM-375 for adding disk information
computeState.address = instance.getPublicIpAddress();
computeState.powerState = AWSUtils.mapToPowerState(instance.getState());
computeState.customProperties = new HashMap<>();
computeState.customProperties.put(CUSTOM_OS_TYPE, getNormalizedOSType(instance));
computeState.customProperties.put(SOURCE_TASK_LINK, ResourceEnumerationTaskService.FACTORY_LINK);
computeState.customProperties.put(ComputeProperties.PLACEMENT_LINK, placementComputeLink);
// Network State. Create one network state mapping to each VPC that is discovered during
// enumeration.
computeState.customProperties.put(AWS_VPC_ID, instance.getVpcId());
computeState.tagLinks = new HashSet<>();
// PATCH to update tagLinks of existing disks.
if (!instance.getTags().isEmpty() && isNewState) {
// we have already made sure that the tags exist and we can build their links ourselves
computeState.tagLinks = instance.getTags().stream().filter(t -> !AWSConstants.AWS_TAG_NAME.equals(t.getKey()) && createdExternalTags.contains(t)).map(t -> newTagState(t.getKey(), t.getValue(), true, tenantLinks)).map(TagFactoryService::generateSelfLink).collect(Collectors.toSet());
if (computeState.tagLinks != null && computeState.tagLinks.contains(null)) {
host.log(Level.SEVERE, "Null tag link inserted in new ComputeState for instance ID: %s", instance.getInstanceId());
host.log(Level.SEVERE, "Removing null tag link from new ComputeState");
computeState.tagLinks.remove(null);
}
}
// The name of the compute state is the value of the AWS_TAG_NAME tag
String nameTag = getTagValue(instance.getTags(), AWS_TAG_NAME);
if (nameTag != null && !nameTag.equals(EMPTY_STRING)) {
computeState.name = nameTag;
}
// append internal tagLinks to any existing ones
if (internalTagLinks != null) {
computeState.tagLinks.addAll(internalTagLinks);
}
if (instance.getLaunchTime() != null) {
computeState.creationTimeMicros = TimeUnit.MILLISECONDS.toMicros(instance.getLaunchTime().getTime());
}
if (diskLinks != null && !diskLinks.isEmpty()) {
computeState.diskLinks = new ArrayList<>();
computeState.diskLinks.addAll(diskLinks);
}
computeState.tenantLinks = tenantLinks;
return computeState;
}
Aggregations