use of com.vmware.photon.controller.model.adapters.vsphere.util.finders.FinderException in project photon-model by vmware.
the class ClientUtils method getDatastoreFromStoragePolicy.
/**
* Get one of the datastore compatible with storage policy
*/
public static ManagedObjectReference getDatastoreFromStoragePolicy(final Connection connection, List<VirtualMachineDefinedProfileSpec> pbmSpec) throws FinderException, InvalidPropertyFaultMsg, RuntimeFaultFaultMsg {
if (pbmSpec != null) {
for (VirtualMachineDefinedProfileSpec sp : pbmSpec) {
try {
PbmProfileId pbmProfileId = new PbmProfileId();
pbmProfileId.setUniqueId(sp.getProfileId());
List<String> datastoreNames = ClientUtils.getDatastores(connection, pbmProfileId);
String dsName = datastoreNames.stream().findFirst().orElse(null);
if (dsName != null) {
ManagedObjectReference dsFromSp = new ManagedObjectReference();
dsFromSp.setType(VimNames.TYPE_DATASTORE);
dsFromSp.setValue(dsName);
return dsFromSp;
}
} catch (Exception runtimeFaultFaultMsg) {
// Just ignore. No need to log, as there are alternative paths.
}
}
}
return null;
}
use of com.vmware.photon.controller.model.adapters.vsphere.util.finders.FinderException in project photon-model by vmware.
the class EnumerationClient method queryDisksAvailabilityinVSphere.
/**
* Utility method that crosschecks the availability of independent disks in vSphere.
*/
public List<String> queryDisksAvailabilityinVSphere(Map<String, Object> diskInfoInLocalIndex) {
final List<String> unAvailableDisks = new ArrayList<>();
diskInfoInLocalIndex.entrySet().stream().forEach(entry -> {
DiskService.DiskState diskState = Utils.fromJson(entry.getValue(), DiskService.DiskState.class);
String diskDirectoryPath = diskState.customProperties.get(CustomProperties.DISK_PARENT_DIRECTORY);
String datastoreName = diskState.customProperties.get(CustomProperties.DISK_DATASTORE_NAME);
HostDatastoreBrowserSearchSpec searchSpec = createHostDatastoreBrowserSearchSpecForDisk(diskState.id);
try {
this.getMoRef.entityProps(this.finder.datastore(datastoreName).object, "browser").entrySet().stream().forEach(item -> {
try {
ManagedObjectReference hostBrowser = (ManagedObjectReference) item.getValue();
ManagedObjectReference task = connection.getVimPort().searchDatastoreSubFoldersTask(hostBrowser, diskDirectoryPath, searchSpec);
TaskInfo info = VimUtils.waitTaskEnd(connection, task);
ArrayOfHostDatastoreBrowserSearchResults searchResult = (ArrayOfHostDatastoreBrowserSearchResults) info.getResult();
if (searchResult == null) {
// Folder is deleted.
unAvailableDisks.add(entry.getKey());
} else {
searchResult.getHostDatastoreBrowserSearchResults().stream().forEach(result -> {
// Folder is present but the vmdk file is deleted.
if (CollectionUtils.isEmpty(result.getFile())) {
unAvailableDisks.add(entry.getKey());
}
});
}
} catch (InvalidPropertyFaultMsg | RuntimeFaultFaultMsg | InvalidCollectorVersionFaultMsg | FileFaultFaultMsg | InvalidDatastoreFaultMsg ex) {
logger.info("Unable to get the availability status for " + entry.getKey());
}
});
} catch (InvalidPropertyFaultMsg | RuntimeFaultFaultMsg | FinderException ex) {
logger.info("Unable to find the datastore : " + datastoreName);
}
});
return unAvailableDisks;
}
use of com.vmware.photon.controller.model.adapters.vsphere.util.finders.FinderException in project photon-model by vmware.
the class InstanceClient method getCustomizationConfigSpecs.
/**
* Get customization config spec for all the image disks if any
*/
private List<VirtualDeviceConfigSpec> getCustomizationConfigSpecs(ArrayOfVirtualDevice devices, List<DiskStateExpanded> diskStates) throws FinderException, InvalidPropertyFaultMsg, RuntimeFaultFaultMsg {
List<VirtualDeviceConfigSpec> specs = new ArrayList<>();
List<VirtualDisk> virtualDisks = devices.getVirtualDevice().stream().filter(d -> d instanceof VirtualDisk).map(d -> (VirtualDisk) d).collect(Collectors.toList());
for (VirtualDisk vd : virtualDisks) {
VirtualDeviceConfigSpec diskSpec = getBootDiskCustomizeConfigSpec(findMatchingImageDiskState(vd, diskStates), vd);
if (diskSpec != null) {
specs.add(diskSpec);
}
}
return specs;
}
use of com.vmware.photon.controller.model.adapters.vsphere.util.finders.FinderException in project photon-model by vmware.
the class InstanceDiskClient method uploadISOContents.
/**
* Uploads ISO content into the chosen datastore
*/
public DeferredResult<DiskService.DiskStateExpanded> uploadISOContents(byte[] contentToUpload) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvalidDatastoreFaultMsg, FileFaultFaultMsg, FinderException {
try {
// 1) fetch data store for the disk
String dsName = this.context.datastoreName;
if (dsName == null || dsName.isEmpty()) {
dsName = ClientUtils.getDefaultDatastore(this.finder);
}
String dataStoreName = dsName;
List<Element> datastoreList = this.finder.datastoreList(dataStoreName);
ManagedObjectReference dsFromSp;
Optional<Element> datastoreOpt = datastoreList.stream().findFirst();
if (datastoreOpt.isPresent()) {
dsFromSp = datastoreOpt.get().object;
} else {
throw new IllegalArgumentException(String.format("No Datastore [%s] present on datacenter", dataStoreName));
}
// 2) Get available hosts for direct upload
String hostName = null;
ArrayOfDatastoreHostMount dsHosts = this.get.entityProp(dsFromSp, VimPath.res_host);
if (dsHosts != null && dsHosts.getDatastoreHostMount() != null) {
DatastoreHostMount dsHost = dsHosts.getDatastoreHostMount().stream().filter(hostMount -> hostMount.getMountInfo() != null && hostMount.getMountInfo().isAccessible() && hostMount.getMountInfo().isMounted()).findFirst().orElse(null);
if (dsHost != null) {
hostName = this.get.entityProp(dsHost.getKey(), VimPath.host_summary_config_name);
}
}
if (hostName == null) {
throw new IllegalStateException(String.format("No host found to upload ISO content " + "for Data Store Disk %s", dataStoreName));
}
// 3) Choose some unique filename
String filename = ClientUtils.getUniqueName(ISO_FILE) + ISO_EXTENSION;
// 4 ) Choose some unique folder name and create it.
String folderName = ClientUtils.getUniqueName(ISO_FOLDER);
ClientUtils.createFolder(this.connection, this.context.datacenterMoRef, String.format(VM_PATH_FORMAT, dataStoreName, folderName));
// 5) form the upload url and acquire generic service ticket for it
String isoUrl = String.format(ISO_UPLOAD_URL, hostName, VimUtils.encode(folderName), VimUtils.encode(filename), VimUtils.encode(dataStoreName));
String ticket = this.connection.getGenericServiceTicket(isoUrl);
// 6) create external client that accepts all certificates
TrustManager[] trustManagers = new TrustManager[] { ClientUtils.getDefaultTrustManager() };
ServiceClient serviceClient = ClientUtils.getCustomServiceClient(trustManagers, this.host, URI.create(isoUrl), this.getClass().getSimpleName());
// 7) PUT operation for the iso content
Operation putISO = Operation.createPut(URI.create(isoUrl));
putISO.setContentType(MEDIA_TYPE_APPLICATION_OCTET_STREAM).setContentLength(contentToUpload.length).addRequestHeader("Cookie", "vmware_cgi_ticket=" + ticket).setBody(contentToUpload).setReferer(this.host.getUri());
return serviceClient.sendWithDeferredResult(putISO).thenApply(op -> {
String diskFullPath = String.format(FULL_PATH, dataStoreName, folderName, filename);
// Update the details of the disk
CustomProperties.of(this.diskState).put(DISK_FULL_PATH, diskFullPath).put(DISK_PARENT_DIRECTORY, String.format(PARENT_DIR, dataStoreName, folderName)).put(DISK_DATASTORE_NAME, dataStoreName);
this.diskState.sourceImageReference = VimUtils.datastorePathToUri(diskFullPath);
return this.diskState;
});
} catch (Exception e) {
return DeferredResult.failed(e);
}
}
Aggregations