use of com.vmware.photon.controller.model.ComputeProperties.CUSTOM_OS_TYPE 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;
}
use of com.vmware.photon.controller.model.ComputeProperties.CUSTOM_OS_TYPE in project photon-model by vmware.
the class GCPEnumerationAdapterService method createHelper.
/**
* This helper function creates a compute state according to the corresponding
* instance on the cloud. It will also creates an auth credential and a compute
* description with it. Moreover, if there is a root disk of the instance on
* cloud, it will creates a root disk locally. Otherwise, it will create a
* default root disk with the compute state. All the creation operations will
* run in parallel. After all remote instances get created, it will jump to
* list vm stage if there is a next page of list vms. Otherwise it will jump
* to the delete stage.
* @param ctx The Enumeration Context.
* @param virtualMachine The virtual machine to be created.
* @param size The number of remaining virtual machines to be created.
*/
private void createHelper(EnumerationContext ctx, GCPInstance virtualMachine, AtomicInteger size) {
List<Operation> operations = new ArrayList<>();
// TODO VSYM-1106: refactor the creation logic here.
// Create compute description.
// Map GCP instance data to compute description.
ComputeDescription computeDescription = new ComputeDescription();
computeDescription.id = UUID.randomUUID().toString();
computeDescription.name = virtualMachine.name;
computeDescription.zoneId = virtualMachine.zone;
// TODO VSYM-1139: dynamically acquire all gcp zones, regions and mappings.
computeDescription.regionId = extractRegionFromZone(virtualMachine.zone);
computeDescription.instanceType = extractActualInstanceType(virtualMachine.machineType);
computeDescription.authCredentialsLink = ctx.parentAuth.documentSelfLink;
computeDescription.documentSelfLink = computeDescription.id;
computeDescription.environmentName = ENVIRONMENT_NAME_GCP;
computeDescription.instanceAdapterReference = UriUtils.buildUri(ServiceHost.LOCAL_HOST, this.getHost().getPort(), GCPUriPaths.GCP_INSTANCE_ADAPTER, null);
computeDescription.statsAdapterReference = UriUtils.buildUri(ServiceHost.LOCAL_HOST, this.getHost().getPort(), GCPUriPaths.GCP_STATS_ADAPTER, null);
computeDescription.tenantLinks = ctx.computeHostDesc.tenantLinks;
Operation compDescOp = Operation.createPost(getHost(), ComputeDescriptionService.FACTORY_LINK).setBody(computeDescription);
operations.add(compDescOp);
// Create root disk.
DiskService.DiskState rootDisk = new DiskService.DiskState();
rootDisk.id = UUID.randomUUID().toString();
rootDisk.documentSelfLink = rootDisk.id;
rootDisk.customProperties = new HashMap<>();
boolean foundRoot = false;
if (virtualMachine.disks != null && !virtualMachine.disks.isEmpty()) {
for (GCPDisk gcpDisk : virtualMachine.disks) {
if (gcpDisk.boot) {
foundRoot = true;
rootDisk.name = gcpDisk.deviceName;
rootDisk.customProperties.put(DISK_AUTO_DELETE, gcpDisk.autoDelete.toString());
break;
}
}
}
if (!foundRoot) {
rootDisk.name = rootDisk.id;
}
// These are required fields in disk service.
// They cannot be accessed during vm enumeration.
rootDisk.type = DiskType.HDD;
rootDisk.capacityMBytes = DEFAULT_DISK_CAPACITY;
rootDisk.sourceImageReference = URI.create(DEFAULT_DISK_SOURCE_IMAGE);
rootDisk.customizationServiceReference = URI.create(DEFAULT_DISK_SERVICE_REFERENCE);
// No matter we find root disk or not, the root disk should be booted first.
rootDisk.bootOrder = 1;
rootDisk.tenantLinks = ctx.computeHostDesc.tenantLinks;
Operation diskOp = Operation.createPost(getHost(), DiskService.FACTORY_LINK).setBody(rootDisk);
operations.add(diskOp);
List<String> vmDisks = new ArrayList<>();
vmDisks.add(UriUtils.buildUriPath(DiskService.FACTORY_LINK, rootDisk.documentSelfLink));
// Create compute state
ComputeState resource = new ComputeState();
resource.id = virtualMachine.id.toString();
resource.type = ComputeType.VM_GUEST;
resource.environmentName = ComputeDescription.ENVIRONMENT_NAME_GCP;
resource.name = virtualMachine.name;
resource.parentLink = ctx.enumRequest.resourceLink();
resource.descriptionLink = UriUtils.buildUriPath(ComputeDescriptionService.FACTORY_LINK, computeDescription.documentSelfLink);
resource.resourcePoolLink = ctx.enumRequest.resourcePoolLink;
resource.diskLinks = vmDisks;
resource.customProperties = new HashMap<>();
String osType = getNormalizedOSType(virtualMachine);
if (osType != null) {
resource.customProperties.put(CUSTOM_OS_TYPE, osType);
}
resource.tenantLinks = ctx.computeHostDesc.tenantLinks;
assignIPAddress(resource, virtualMachine);
assignPowerState(resource, virtualMachine.status);
Operation resourceOp = Operation.createPost(getHost(), ComputeService.FACTORY_LINK).setBody(resource);
operations.add(resourceOp);
OperationJoin.create(operations).setCompletion((ops, exs) -> {
if (exs != null) {
exs.values().forEach(ex -> logWarning(() -> String.format("Error: %s", ex.getMessage())));
}
if (size.decrementAndGet() == 0) {
ctx.virtualMachines.clear();
if (ctx.enumNextPageLink != null) {
ctx.subStage = EnumerationSubStages.LIST_REMOTE_VMS;
} else {
logFine(() -> "Finished creating compute states");
ctx.subStage = EnumerationSubStages.DELETE_LOCAL_VMS;
}
handleSubStage(ctx);
}
}).sendWith(this);
}
Aggregations