示例#1
0
        public async Task <(bool, bool)> GetCBTState(string vmMoRef)
        {
            if (session == null)
            {
                throw new Exception("Not Logged");
            }

            var propertySpec = new PropertySpec
            {
                pathSet = new string[] { "config.changeTrackingEnabled", "capability.changeTrackingSupported" },
                type    = "VirtualMachine"
            };
            var propertyFilterSpec = new PropertyFilterSpec
            {
                propSet   = new PropertySpec[] { propertySpec },
                objectSet = new ObjectSpec[] { new ObjectSpec()
                                               {
                                                   obj = new ManagedObjectReference {
                                                       type = "VirtualMachine", Value = vmMoRef
                                                   }
                                               } }
            };

            var vmPowerStateReq = await Vim25Client.RetrievePropertiesAsync(serviceContent.propertyCollector, new PropertyFilterSpec[] { propertyFilterSpec });

            var changeTrackingEnabled   = (bool)vmPowerStateReq.returnval[0].propSet.FirstOrDefault(p => p.name == "config.changeTrackingEnabled")?.val;
            var changeTrackingSupported = (bool)vmPowerStateReq.returnval[0].propSet.FirstOrDefault(p => p.name == "capability.changeTrackingSupported")?.val;

            return(changeTrackingEnabled, changeTrackingSupported);
        }
示例#2
0
        public async Task <VirtualMachinePowerState> GetVMPowerState(string vmMoRef)
        {
            if (session == null)
            {
                throw new Exception("Not Logged");
            }

            var propertySpec = new PropertySpec
            {
                pathSet = new string[] { "runtime.powerState" },
                type    = "VirtualMachine"
            };
            var propertyFilterSpec = new PropertyFilterSpec
            {
                propSet   = new PropertySpec[] { propertySpec },
                objectSet = new ObjectSpec[] { new ObjectSpec()
                                               {
                                                   obj = new ManagedObjectReference {
                                                       type = "VirtualMachine", Value = vmMoRef
                                                   }
                                               } }
            };

            var vmPowerStateReq = await Vim25Client.RetrievePropertiesAsync(serviceContent.propertyCollector, new PropertyFilterSpec[] { propertyFilterSpec });

            return((VirtualMachinePowerState)vmPowerStateReq.returnval[0].propSet.FirstOrDefault(p => p.name == "runtime.powerState")?.val);
        }
示例#3
0
        public async Task CreateVM(string folderMoRef, object configSpec, string resourcePoolMoRef, string hostMoRef)
        {
            if (session == null)
            {
                throw new Exception("Not Logged");
            }

            var vmConfig = configSpec as VirtualMachineConfigSpec;

            if (vmConfig == null)
            {
                throw new ArgumentException($"{nameof(configSpec)} must be of type VirtualMachineConfigSpec");
            }

            var folder = new ManagedObjectReference {
                type = "Folder", Value = folderMoRef
            };
            var pool = new ManagedObjectReference {
                type = "ResourcePool", Value = resourcePoolMoRef
            };
            var host = new ManagedObjectReference {
                type = "Host", Value = hostMoRef
            };

            var createTask = await Vim25Client.CreateVM_TaskAsync(folder, vmConfig, pool, host);

            var taskInfo = await WaitForTaskEnd(createTask);

            if (taskInfo.state != TaskInfoState.success)
            {
                throw new Exception(taskInfo.error.localizedMessage);
            }
        }
示例#4
0
        public async Task <object> GetVMConfigFromSnapshot(string snapshotMoRef)
        {
            if (session == null)
            {
                throw new Exception("Not Logged");
            }

            var propertySpecSnap = new PropertySpec
            {
                pathSet = new string[] { "config" },
                type    = "VirtualMachineSnapshot"
            };
            var propertyFilterSpecSnap = new PropertyFilterSpec
            {
                propSet   = new PropertySpec[] { propertySpecSnap },
                objectSet = new ObjectSpec[] { new ObjectSpec()
                                               {
                                                   obj = new ManagedObjectReference {
                                                       type = "VirtualMachineSnapshot", Value = snapshotMoRef
                                                   }
                                               } }
            };
            var snapProps = await Vim25Client.RetrievePropertiesAsync(serviceContent.propertyCollector, new PropertyFilterSpec[] { propertyFilterSpecSnap });

            return(snapProps.returnval[0].propSet.FirstOrDefault(p => p.name == "config")?.val as VirtualMachineConfigInfo);
        }
示例#5
0
        public async Task <IEnumerable <ManagedEntity> > GetVMs()
        {
            if (session == null)
            {
                throw new Exception("Not Logged");
            }

            ////////////////////////////////////////////////////////

            var dc2vmFolder = new TraversalSpec
            {
                type      = "Datacenter",
                path      = "vmFolder",
                selectSet = new SelectionSpec[] { new SelectionSpec {
                                                      name = "folderTSpec"
                                                  } }
            };

            var folderTS = new TraversalSpec
            {
                name      = "folderTSpec",
                type      = "Folder",
                path      = "childEntity",
                selectSet = new SelectionSpec[] { new SelectionSpec {
                                                      name = "folderTSpec"
                                                  }, dc2vmFolder }
            };

            var ospec = new ObjectSpec
            {
                obj       = serviceContent.rootFolder,
                skip      = false,
                selectSet = new SelectionSpec[] { folderTS }
            };

            /////////////////////////////////////////////

            var vmSp = new PropertySpec
            {
                type    = "VirtualMachine",
                all     = false,
                pathSet = new string[] { "name" }
            };

            ////////////////////////////////////////////

            var fs = new PropertyFilterSpec {
                objectSet = new ObjectSpec[] { ospec }, propSet = new PropertySpec[] { vmSp }
            };

            var vmProps = await Vim25Client.RetrievePropertiesAsync(serviceContent.propertyCollector, new PropertyFilterSpec[] { fs });

            return(vmProps.returnval
                   .Select(obj => new ManagedEntity {
                MoRef = obj.obj.Value, Type = obj.obj.type, Name = (string)obj.propSet[0].val
            }));
        }
示例#6
0
        public async Task Logout()
        {
            if (session == null)
            {
                throw new Exception("Not Logged");
            }

            await Vim25Client.LogoutAsync(serviceContent.sessionManager);

            session = null;
        }
示例#7
0
        public async Task RemoveSnapshot(string snapshotMoRef, bool removeChildren, bool consolidate)
        {
            if (session == null)
            {
                throw new Exception("Not Logged");
            }

            var taskRef = await Vim25Client.RemoveSnapshot_TaskAsync(new ManagedObjectReference { type = "VirtualMachineSnapshot", Value = snapshotMoRef }, removeChildren, consolidate);

            var taskInfo = await WaitForTaskEnd(taskRef);

            if (taskInfo.state != TaskInfoState.success)
            {
                throw new Exception(taskInfo.error.localizedMessage);
            }
        }
示例#8
0
        public async Task <string> CreateSnapshot(string virtualMachineMoRef, string name, string description, bool memory, bool quiesce)
        {
            if (session == null)
            {
                throw new Exception("Not Logged");
            }

            var taskRef = await Vim25Client.CreateSnapshot_TaskAsync(new ManagedObjectReference { type = "VirtualMachine", Value = virtualMachineMoRef }, name, description, memory, quiesce);

            var taskInfo = await WaitForTaskEnd(taskRef);

            if (taskInfo.state != TaskInfoState.success)
            {
                throw new Exception(taskInfo.error.localizedMessage);
            }
            var snapRef = taskInfo.result as ManagedObjectReference;

            return(snapRef.Value);
        }
示例#9
0
        public async Task <IEnumerable <(long start, long length)> > GetDiskChangedAreas(string vmMoRef, string snapshotMoRef, int diskKey, long startOffset, string changeId = "*")
        {
            if (session == null)
            {
                throw new Exception("Not Logged");
            }

            var diskChangeInfo = await Vim25Client.QueryChangedDiskAreasAsync(
                new ManagedObjectReference { type = "VirtualMachine", Value = vmMoRef },
                new ManagedObjectReference { type = "VirtualMachineSnapshot", Value = snapshotMoRef },
                diskKey, startOffset, changeId);

            if (diskChangeInfo.changedArea == null)
            {
                return(Enumerable.Empty <(long start, long length)>());
            }

            return(diskChangeInfo.changedArea.OrderBy(change => change.start).Select(change => (change.start, change.length)));
        }
示例#10
0
        private async Task <TaskInfo> WaitForTaskEnd(ManagedObjectReference task)
        {
            if (session == null)
            {
                throw new Exception("Not Logged");
            }

            if (task.type != "Task")
            {
                throw new ArgumentException($"{nameof(task)} is not of type \"Task\"");
            }

            var propertySpecTask = new PropertySpec
            {
                pathSet = new string[] { "info" },
                type    = "Task"
            };
            var propertyFilterSpecTask = new PropertyFilterSpec
            {
                propSet   = new PropertySpec[] { propertySpecTask },
                objectSet = new ObjectSpec[] { new ObjectSpec {
                                                   obj = task
                                               } }
            };

            var taskProps = await Vim25Client.RetrievePropertiesAsync(serviceContent.propertyCollector, new PropertyFilterSpec[] { propertyFilterSpecTask });

            var configTaskInfo = taskProps.returnval[0].propSet[0].val as TaskInfo;

            while (configTaskInfo?.state == TaskInfoState.running)
            {
                await Task.Delay(2000);

                taskProps = await Vim25Client.RetrievePropertiesAsync(serviceContent.propertyCollector, new PropertyFilterSpec[] { propertyFilterSpecTask });

                configTaskInfo = taskProps.returnval[0].propSet[0].val as TaskInfo;
            }
            ;

            return(configTaskInfo);
        }
示例#11
0
        public async Task Login(string username, string password, string locale = null)
        {
            if (string.IsNullOrWhiteSpace(username))
            {
                throw new ArgumentException("Argument cannot be null or empty", nameof(username));
            }

            if (string.IsNullOrWhiteSpace(password))
            {
                throw new ArgumentException("Argument cannot be null or empty", nameof(password));
            }

            var serviceRef = new ManagedObjectReference
            {
                type  = "ServiceInstance",
                Value = "ServiceInstance"
            };

            serviceContent = await Vim25Client.RetrieveServiceContentAsync(serviceRef);

            session = await Vim25Client.LoginAsync(serviceContent.sessionManager, username, password, locale);
        }
示例#12
0
        public async Task ConfigureForCBT(string vmMoRef)
        {
            if (session == null)
            {
                throw new Exception("Not Logged");
            }

            var taskRef = await Vim25Client.ReconfigVM_TaskAsync(
                new ManagedObjectReference { type = "VirtualMachine", Value = vmMoRef },
                new VirtualMachineConfigSpec { changeTrackingEnabled = true });

            var configTaskInfo = await WaitForTaskEnd(taskRef);

            if (configTaskInfo.state != TaskInfoState.success)
            {
                throw new Exception(configTaskInfo.error.localizedMessage);
            }

            var snapTask = await CreateSnapshot(vmMoRef, "Enable CBT", "", false, false);

            await RemoveSnapshot(snapTask, false, true);
        }
示例#13
0
        public async Task <IEnumerable <ManagedEntity> > GetPools()
        {
            if (session == null)
            {
                throw new Exception("Not Logged");
            }

            ////////////////////////////////////////////////////////

            var dc2hostFolder = new TraversalSpec
            {
                type      = "Datacenter",
                path      = "hostFolder",
                selectSet = new SelectionSpec[] { new SelectionSpec {
                                                      name = "ressourcesTSpec"
                                                  } }
            };

            var cr2resourcePool = new TraversalSpec
            {
                type      = "ComputeResource",
                path      = "resourcePool",
                selectSet = new SelectionSpec[] { new SelectionSpec {
                                                      name = "ressourcesTSpec"
                                                  } }
            };

            var rp2rp = new TraversalSpec
            {
                type      = "ResourcePool",
                path      = "resourcePool",
                selectSet = new SelectionSpec[] { new SelectionSpec {
                                                      name = "ressourcesTSpec"
                                                  } }
            };

            var folderTS = new TraversalSpec
            {
                name      = "ressourcesTSpec",
                type      = "Folder",
                path      = "childEntity",
                selectSet = new SelectionSpec[] { new SelectionSpec {
                                                      name = "ressourcesTSpec"
                                                  }, dc2hostFolder, cr2resourcePool, rp2rp }
            };


            var ospec = new ObjectSpec
            {
                obj       = serviceContent.rootFolder,
                skip      = false,
                selectSet = new SelectionSpec[] { folderTS }
            };

            /////////////////////////////////////////////

            var dcSp = new PropertySpec
            {
                type    = "Datacenter",
                all     = false,
                pathSet = new string[] { "parent", "name" }
            };

            var folderSp = new PropertySpec
            {
                type    = "Folder",
                all     = false,
                pathSet = new string[] { "parent", "name" }
            };

            var computeSp = new PropertySpec
            {
                type    = "ComputeResource",
                all     = false,
                pathSet = new string[] { "parent", "name" }
            };

            var rpSp = new PropertySpec
            {
                type    = "ResourcePool",
                all     = false,
                pathSet = new string[] { "parent", "name" }
            };

            ////////////////////////////////////////////

            var fs = new PropertyFilterSpec {
                objectSet = new ObjectSpec[] { ospec }, propSet = new PropertySpec[] { dcSp, folderSp, computeSp, rpSp }
            };

            var vmProps = await Vim25Client.RetrievePropertiesAsync(serviceContent.propertyCollector, new PropertyFilterSpec[] { fs });

            return(vmProps.returnval
                   .Select(obj =>
                           new ManagedEntity
            {
                MoRef = obj.obj.Value,
                Type = obj.obj.type,
                Name = (string)obj.propSet.FirstOrDefault(o => o.name == "name")?.val,
                Parent = ((ManagedObjectReference)obj.propSet.FirstOrDefault(o => o.name == "parent")?.val)?.Value
            }));
        }