Как запросить у vSphere существующую виртуальную машину?

Используя библиотеку VMware.Vim (я считаю, что это часть PowerCLI), я пытаюсь найти конкретную машину, которая существует в vSphere. Мой код выглядит так:

using VMware.Vim;
var client = new VimClient();
client.Connect("http://my-vsphere/sdk");
client.Login("username", "password");

var filter = new NameValueCollection();
filter.Add("name", "my-vm-name");
var vms1 = client.FindEntityViews(typeof(VirtualMachine), null, filter, null);
// vms1 is null here. WTF?

var vms2 = client.FindEntityViews(typeof(VirtualMachine), null, null, null);
foreach (VirtualMachine vm in vms)
{
    if(vm.Name = "my-vm-name")
    {
        Console.WriteLine("Found it!");
    }
}
// This works!

По сути, если я следую методу, описанному в документации SDK, я не могу найти машину. Если я вслепую запрошу все машины и пройдусь по коллекции, я смогу ее найти.

Я что-то упустил здесь?


person Paul    schedule 17.04.2015    source источник


Ответы (2)


Я понял это... Это не упоминается в документации SDK, которую я просматривал, но строковые значения, добавленные в фильтр, не являются необработанными строками; они являются регулярными выражениями.

В моей ситуации имя машины было в форме "Machine (Other Info)". Если эта строка будет передана в фильтр "как есть", он не будет работать. Если скобки экранированы, например "Machine \\(Other Info\\)", поиск завершится успешно.

person Paul    schedule 17.04.2015

вы можете использовать Regex.Escape для ввода пользователя:

var filter = new NameValueCollection { { "name", $"^{Regex.Escape(name)}$" } };
person Oilid    schedule 17.05.2017