private async Task <NetVimClient.ObjectContent[]> LoadReferenceTree(VimPortTypeClient client) { var plan = new TraversalSpec { name = "FolderTraverseSpec", type = "Folder", path = "childEntity", selectSet = new SelectionSpec[] { new TraversalSpec() { type = "Datacenter", path = "datastore", selectSet = new SelectionSpec[] { new SelectionSpec { name = "FolderTraverseSpec" } } }, new TraversalSpec() { type = "Folder", path = "childEntity", selectSet = new SelectionSpec[] { new SelectionSpec { name = "FolderTraverseSpec" } } } } }; var props = new PropertySpec[] { new PropertySpec { type = "Datastore", pathSet = new string[] { "name", "browser" } } }; ObjectSpec objectspec = new ObjectSpec(); objectspec.obj = _sic.rootFolder; objectspec.selectSet = new SelectionSpec[] { plan }; PropertyFilterSpec filter = new PropertyFilterSpec(); filter.propSet = props; filter.objectSet = new ObjectSpec[] { objectspec }; PropertyFilterSpec[] filters = new PropertyFilterSpec[] { filter }; RetrievePropertiesResponse response = await client.RetrievePropertiesAsync(_props, filters); return(response.returnval); }
public async Task <string> GetPowerState(Guid uuid) { _logger.LogDebug("GetPowerState called"); ManagedObjectReference vmReference = vmReference = await GetVm(uuid); if (vmReference == null) { _logger.LogDebug($"could not get state, vmReference is null"); return("error"); } //retrieve the properties specificied RetrievePropertiesResponse response = await _client.RetrievePropertiesAsync( _props, VmFilter(vmReference)); return(GetPowerState(response)); }
private async Task getRecentTasks() { if (_sic != null && _sic.taskManager != null) { PropertyFilterSpec[] filters = createPFSForRecentTasks(_sic.taskManager); RetrievePropertiesResponse response = await _client.RetrievePropertiesAsync(_props, filters); _runningTasks.Clear(); foreach (var task in response.returnval) { try { var vmString = _connectionService.GetVmGuidByName(((ManagedObjectReference)task.GetProperty("info.entity")).Value).ToString(); var broadcastTime = DateTime.UtcNow.ToString(); var taskId = task.GetProperty("info.key") != null?task.GetProperty("info.key").ToString() : ""; var taskType = task.GetProperty("info.descriptionId") != null?task.GetProperty("info.descriptionId").ToString() : ""; var progress = task.GetProperty("info.progress") != null?task.GetProperty("info.progress").ToString() : ""; var state = task.GetProperty("info.state") != null?task.GetProperty("info.state").ToString() : ""; var notification = new Notification() { broadcastTime = DateTime.UtcNow.ToString(), taskId = taskId, taskName = taskType.Replace("VirtualMachine.", ""), taskType = taskType, progress = progress, state = state }; var vmTasks = _runningTasks.ContainsKey(vmString) ? _runningTasks[vmString] : new List <Notification>(); vmTasks.Add(notification); _runningTasks.AddOrUpdate(vmString, vmTasks, (k, v) => (v = vmTasks)); } catch (Exception ex) { this._logger.LogError(ex.Message); } } } }
private async Task <ObjectContent[]> LoadReferenceTree(VimPortTypeClient client) { var plan = new TraversalSpec { name = "FolderTraverseSpec", type = "Folder", path = "childEntity", selectSet = new SelectionSpec[] { new TraversalSpec() { type = "Datacenter", path = "hostFolder", selectSet = new SelectionSpec[] { new SelectionSpec { name = "FolderTraverseSpec" } } }, new TraversalSpec() { type = "Datacenter", path = "networkFolder", selectSet = new SelectionSpec[] { new SelectionSpec { name = "FolderTraverseSpec" } } }, new TraversalSpec() { type = "ComputeResource", path = "resourcePool", selectSet = new SelectionSpec[] { new TraversalSpec { type = "ResourcePool", path = "resourcePool" } } }, new TraversalSpec() { type = "ComputeResource", path = "host" }, new TraversalSpec() { type = "Folder", path = "childEntity" } } }; var props = new PropertySpec[] { new PropertySpec { type = "Datacenter", pathSet = new string[] { "name", "parent", "vmFolder" } }, new PropertySpec { type = "ComputeResource", pathSet = new string[] { "name", "parent", "resourcePool", "host" } }, new PropertySpec { type = "HostSystem", pathSet = new string[] { "configManager" } }, new PropertySpec { type = "ResourcePool", pathSet = new string[] { "name", "parent", "resourcePool" } }, new PropertySpec { type = "DistributedVirtualSwitch", pathSet = new string[] { "name", "parent", "uuid" } }, new PropertySpec { type = "DistributedVirtualPortgroup", pathSet = new string[] { "name", "parent", "config" } } }; ObjectSpec objectspec = new ObjectSpec(); objectspec.obj = _sic.rootFolder; objectspec.selectSet = new SelectionSpec[] { plan }; PropertyFilterSpec filter = new PropertyFilterSpec(); filter.propSet = props; filter.objectSet = new ObjectSpec[] { objectspec }; PropertyFilterSpec[] filters = new PropertyFilterSpec[] { filter }; RetrievePropertiesResponse response = await client.RetrievePropertiesAsync(_props, filters); return(response.returnval); }
public async Task <Vm> Save(string id) { await Connect(); Vm vm = _vmCache[id]; //protect stock disks; only save a disk if it is local to the workspace //i.e. the disk folder matches the workspaceId if (vm.Name.Tag().HasValue() && !vm.DiskPath.Contains(vm.Name.Tag())) { throw new InvalidOperationException("External templates must be cloned into local templates in order to be saved."); } _logger.LogDebug($"Save: get current snap for vm {vm.Name}"); //Get the current snapshot mor ManagedObjectReference mor = null; RetrievePropertiesResponse response = await _vim.RetrievePropertiesAsync( _props, FilterFactory.VmFilter(vm.AsVim(), "snapshot")); ObjectContent[] oc = response.returnval; mor = ((VirtualMachineSnapshotInfo)oc.First().GetProperty("snapshot")).currentSnapshot as ManagedObjectReference; // if (oc.Length > 0 && oc[0].propSet.Length > 0 && oc[0].propSet[0].val != null) // mor = ((VirtualMachineSnapshotInfo)oc[0].propSet[0].val).currentSnapshot; //add new snapshot _logger.LogDebug($"Save: add new snap for vm {vm.Name}"); ManagedObjectReference task = await _vim.CreateSnapshot_TaskAsync( vm.AsVim(), "Root Snap", "Created by TopoMojo Save at " + DateTime.UtcNow.ToString("s") + "Z", false, false); TaskInfo info = await WaitForVimTask(task); //remove previous snapshot if (mor != null) { _logger.LogDebug($"Save: remove previous snap for vm {vm.Name}"); task = await _vim.RemoveSnapshot_TaskAsync(mor, false, true); await Task.Delay(500); info = await GetVimTaskInfo(task); if (info.state == TaskInfoState.error) { throw new Exception(info.error.localizedMessage); } if (info.progress < 100) { var t = new VimHostTask { Task = task, Action = "saving", WhenCreated = DateTime.UtcNow }; vm.Task = new VmTask { Name = t.Action, WhenCreated = t.WhenCreated, Progress = t.Progress }; _tasks.Add(vm.Id, t); } } _vmCache.TryUpdate(vm.Id, vm, vm); return(vm); }
static void Main(string[] args) { string url = "https://vcenter.sddc-34-199-139-62.vmwarevmc.com"; string username = ""; string password = Environment.GetEnvironmentVariable("VCENTER_PWD"); string datastoreBrowserKey = "datastoreBrowser-datastore-59"; string path = "[WorkloadDatastore] 834dde5e-cbd6-413d-c0f8-122cc9c14f4d/00000000-0000-0000-0000-000000000000"; string searchRegex = "*.vmdk"; var dsbMOR = new ManagedObjectReference { type = "HostDatastoreBrowser", Value = datastoreBrowserKey }; var vim = new VimPortTypeClient( VimPortTypeClient.EndpointConfiguration.VimPort, $"{url}/sdk" ); var _sic = vim.RetrieveServiceContentAsync( new ManagedObjectReference { type = "ServiceInstance", Value = "ServiceInstance" } ).Result; var _props = _sic.propertyCollector; var _session = vim.LoginAsync( _sic.sessionManager, username, password, null ).Result; // search datastore var searchSpec = new HostDatastoreBrowserSearchSpec { matchPattern = new string[] { searchRegex }, }; // var task = vim.SearchDatastore_TaskAsync( var task = vim.SearchDatastoreSubFolders_TaskAsync( dsbMOR, path, searchSpec ).Result; Console.WriteLine($"{task.type} {task.Value}"); Console.WriteLine($"{url}/mob/?moid={task.Value}"); Console.WriteLine(); Console.WriteLine("Sent request, awaiting response..."); Task.Delay(2000).Wait(); var response = vim.RetrievePropertiesAsync( _props, new PropertyFilterSpec[] { new PropertyFilterSpec { propSet = new PropertySpec[] { new PropertySpec { type = "Task", pathSet = new string[] { "info" } } }, objectSet = new ObjectSpec[] { new ObjectSpec { obj = task } } } } ).Result; ObjectContent[] oc = response.returnval; var info = (TaskInfo)oc[0]?.propSet[0]?.val; var results = info?.result as HostDatastoreBrowserSearchResults[]; foreach (var result in results) { foreach (var file in result.file) { Console.WriteLine(result.folderPath, file.path); } } Console.WriteLine("\nDone."); }
private async Task LoadCache() { var plan = new TraversalSpec { name = "FolderTraverseSpec", type = "Folder", path = "childEntity", selectSet = new SelectionSpec[] { new TraversalSpec() { type = "Datacenter", path = "networkFolder", selectSet = new SelectionSpec[] { new SelectionSpec { name = "FolderTraverseSpec" } } }, new TraversalSpec() { type = "Datacenter", path = "vmFolder", selectSet = new SelectionSpec[] { new SelectionSpec { name = "FolderTraverseSpec" } } }, new TraversalSpec() { type = "Datacenter", path = "datastore", selectSet = new SelectionSpec[] { new SelectionSpec { name = "FolderTraverseSpec" } } }, new TraversalSpec() { type = "Folder", path = "childEntity", selectSet = new SelectionSpec[] { new SelectionSpec { name = "FolderTraverseSpec" } } }, } }; var props = new PropertySpec[] { new PropertySpec { type = "DistributedVirtualSwitch", pathSet = new string[] { "name", "uuid", "config.uplinkPortgroup" } }, new PropertySpec { type = "DistributedVirtualPortgroup", pathSet = new string[] { "name", "host", "config.distributedVirtualSwitch" } }, new PropertySpec { type = "Network", pathSet = new string[] { "name", "host" } }, new PropertySpec { type = "VirtualMachine", pathSet = new string[] { "name", "config.uuid", "summary.runtime.powerState", "guest.net" } }, new PropertySpec { type = "Datastore", pathSet = new string[] { "name", "browser" } } }; ObjectSpec objectspec = new ObjectSpec(); objectspec.obj = _sic.rootFolder; objectspec.selectSet = new SelectionSpec[] { plan }; PropertyFilterSpec filter = new PropertyFilterSpec(); filter.propSet = props; filter.objectSet = new ObjectSpec[] { objectspec }; PropertyFilterSpec[] filters = new PropertyFilterSpec[] { filter }; _logger.LogInformation($"Starting RetrieveProperties at {DateTime.UtcNow}"); RetrievePropertiesResponse response = await _client.RetrievePropertiesAsync(_props, filters); _logger.LogInformation($"Finished RetrieveProperties at {DateTime.UtcNow}"); _logger.LogInformation($"Starting LoadMachineCache at {DateTime.UtcNow}"); await LoadMachineCache(response.returnval.FindType("VirtualMachine")); _logger.LogInformation($"Finished LoadMachineCache at {DateTime.UtcNow}"); _logger.LogInformation($"Starting LoadNetworkCache at {DateTime.UtcNow}"); LoadNetworkCache( response.returnval.FindType("DistributedVirtualSwitch"), response.returnval.Where(o => o.obj.type.EndsWith("Network") || o.obj.type.EndsWith("DistributedVirtualPortgroup")).ToArray()); _logger.LogInformation($"Finished LoadNetworkCache at {DateTime.UtcNow}"); _logger.LogInformation($"Starting LoadDatastoreCache at {DateTime.UtcNow}"); LoadDatastoreCache(response.returnval.FindType("Datastore")); _logger.LogInformation($"Finished LoadDatastoreCache at {DateTime.UtcNow}"); }
private async Task getRecentTasks() { if (_sic != null && _sic.taskManager != null) { var pendingVms = await _dbContext.Vms .Include(x => x.VmTeams) .Where(x => x.HasPendingTasks) .ToArrayAsync(); var stillPendingVmIds = new List <Guid>(); PropertyFilterSpec[] filters = createPFSForRecentTasks(_sic.taskManager); RetrievePropertiesResponse response = await _client.RetrievePropertiesAsync(_props, filters); _runningTasks.Clear(); var forceCheckMachineState = false; foreach (var task in response.returnval) { try { Guid?vmId = null; var vmRef = task.GetProperty("info.entity") != null ? ((ManagedObjectReference)task.GetProperty("info.entity")).Value : null; if (vmRef != null) { vmId = _connectionService.GetVmIdByRef(vmRef); } var broadcastTime = DateTime.UtcNow.ToString(); var taskId = task.GetProperty("info.key") != null?task.GetProperty("info.key").ToString() : ""; var taskType = task.GetProperty("info.descriptionId") != null?task.GetProperty("info.descriptionId").ToString() : ""; var progress = task.GetProperty("info.progress") != null?task.GetProperty("info.progress").ToString() : ""; var state = task.GetProperty("info.state") != null?task.GetProperty("info.state").ToString() : ""; var notification = new Notification() { broadcastTime = DateTime.UtcNow.ToString(), taskId = taskId, taskName = taskType.Replace("VirtualMachine.", ""), taskType = taskType, progress = progress, state = state }; if (vmId.HasValue) { var id = vmId.Value.ToString(); var vmTasks = _runningTasks.ContainsKey(id) ? _runningTasks[id] : new List <Notification>(); vmTasks.Add(notification); _runningTasks.AddOrUpdate(id, vmTasks, (k, v) => (v = vmTasks)); } if ((state == TaskInfoState.queued.ToString() || state == TaskInfoState.running.ToString())) { _tasksPending = true; if (vmId.HasValue) { stillPendingVmIds.Add(vmId.Value); } } if (state == TaskInfoState.success.ToString() && (this.GetPowerTaskTypes().Contains(taskType))) { if (vmId.HasValue) { forceCheckMachineState = true; } } } catch (Exception ex) { this._logger.LogError(ex, "Exception processing task"); } } foreach (var vm in pendingVms) { if (!stillPendingVmIds.Contains(vm.Id)) { vm.HasPendingTasks = false; } } var vmsToUpdate = await _dbContext.Vms .Include(x => x.VmTeams) .Where(x => stillPendingVmIds.Contains(x.Id)) .ToArrayAsync(); foreach (var vm in vmsToUpdate) { vm.HasPendingTasks = true; } await _dbContext.SaveChangesAsync(); if (forceCheckMachineState) { _machineStateService.CheckState(); } } }