2017-02-07 16 views
0

Я работаю над веб-интерфейсом, который управляет виртуальными машинами на vsphere Esx 5.5. Моя программа разработана с использованием веб-форм .net (а не MVC).Как подождать задание после клонирования VM с помощью VMWare.vim.dll?

Я следил за сообщениями Jeffpaton (используя VMware.Vim), которые помогли мне (спасибо, Jeff) https://communities.vmware.com/thread/434579.

Но теперь я замерзаю на эту тему. Я не знаю, как подождать задание после клонирования виртуальной машины. Мой веб-сайт запускает команду vsphere для Vsphere Esx с vmware.vim. Мне нужно знать, когда vpshere закончил свою работу, чтобы запустить другую инструкцию.

Я пытаюсь использовать PropertyCollector, но я не знаю, как использовать его:

я красный этот пост, но без успеха:

Вот часть моего кода с попыткой, но я заблокирован. Я использую функции jeffpaton.

using VMware.Vim; 
... 
VimClient client; 
string serverUrl = "..." 
client.Connect("https://" + serverUrl + "/sdk"); 
client.Login(userLogin, userPassword); 
... 
ManagedObjectReference cloneTask_MoRef = null; 

//1 waiting the cloning task 
cloneTask_MoRef = sourceVm.cloneVM_Task(sourceVm.Parent, "cloneName", mySpec); 

if (cloneTask_MoRef == null) { 
//error 
}else 
{ 
    PropertyCollector pc = new PropertyCollector(client, cloneTask_MoRef); 

    PropertyFilterSpec[] pfs = null; 
    RetrieveOptions ro = new RetrieveOptions(); 
    RetrieveResult rResult = new RetrieveResult(); 


    //PropertySpec 
    //pc.CreateFilter(pfs, true); 
    //rResult = pc.RetrievePropertiesEx(pfs,ro); 
    // 

    //2 PowerOn the CloneVM              
    cloneVM = this.vimClientTools.getVirtualMachines(selectedDC, cloneName)[0]; 

    //3 waiting the powerOn Task... 

     //What could i do to know if the task is over or in progress ? :-(

Мне нужна помощь. если у кого-то есть предложение ...

Спасибо за все.

ответ

0

Возможно, это слишком поздно, но здесь идет.

У VimClient есть метод WaitForTask;

client.WaitForTask(cloneTask_MoRef); 

В качестве альтернативы вы можете получить задание и просмотреть его прогресс;

var task = (Task) client.GetView(cloneTask_MoRef, null); 

while (task.Info.State != TaskInfoState.success) 
{ 
    Thread.Sleep(5000); 
    task.UpdateViewData(); 
    if (task.Info.State == TaskInfoState.error) 
     throw new Exception($"The clone failed: {task.Info.Error.LocalizedMessage}"); 

    Console.WriteLine(task.Info.Progress); 
}