Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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.");
        }
Ejemplo n.º 7
0
        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}");
        }
Ejemplo n.º 8
0
        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();
                }
            }
        }