При создании виртуальных машин через ManageIQ мы столкнулись с ограничениями допустимых значений основных параметров VM на платформе VMware: количества vCPU и объёма памяти. Поскольку процессы в нашей компании не предполагают ограничений каких-либо параметров, то потребовалось провести небольшое исследование кода и документации для поиска решения.
Симптомы проблемы
При развёртывании VM и установки произвольного значения (отсутствующего в стандартном диалоге развёртывания) для количества vCPU и/или RAM, развёртывание происходит успешно, однако, созданная VM получает неверную конфигурацию: количество vCPU и/или RAM установлено в минимальное значение.
В логах развёртывания обнаружено одно или несколько предупреждений ‘No matching item found’:
WARN -- evm: Q-task_id([r774_service_template_provision_task_773]) MIQ(ManageIQ::Providers::Vmware::InfraManager::ProvisionWorkflow#set_ws_field_value) Unable to find value for key <hardware:number_of_sockets(integer)> with input value <nil>. No matching item found.
INFO -- evm: Q-task_id([r774_service_template_provision_task_773]) MIQ(ManageIQ::Providers::Vmware::InfraManager::ProvisionWorkflow#set_ws_field_value) processing key <hardware:number_of_sockets(integer)> with values <{1=>"1", 2=>"2", 4=>"4", 8=>"8"}>
...
WARN -- evm: Q-task_id([r774_service_template_provision_task_773]) MIQ(ManageIQ::Providers::Vmware::InfraManager::ProvisionWorkflow#set_ws_field_value) Unable to find value for key <hardware:vm_memory(string)> with input value <nil>. No matching item found.
INFO -- evm: Q-task_id([r774_service_template_provision_task_773]) MIQ(ManageIQ::Providers::Vmware::InfraManager::ProvisionWorkflow#set_ws_field_value) processing key <hardware:vm_memory(string)> with values <{"1024"=>"1024", "2048"=>"2048", "4096"=>"4096", "8192"=>"8192", "12288"=>"12288", "16384"=>"16384", "32768"=>"32768", "65536"=>"65536", "131072"=>"131072"}>
Причины проблемы
Перед запуском развёртывания производится выбор профиля по группе пользователя: /Infrastructure/VM/Provisioning/Profile/*. Профиль определяет методы выбора сетей, именования машин, выбора диалога развёртывания, классы для согласования запросов, расчета квот и процесса создания виртуальных машин.

По умолчанию определены два идентичных профиля: для группы EvmGroup-super_administrator и для всех остальных (.missing). При клонировании VM из шаблона на платформе виртуализации VMware vSphere dialog_name получит значение miq_provision_vmware_dialogs_template. (/Automation/Automate/Customization/Provisioning Dialogs/Sample VM Provisioning Dialog (Template)) В этом диалоге и заданы ограничения, которые мы искали:
:number_of_sockets:
:values:
1: "1"
2: "2"
4: "4"
8: "8"
:description: Number of Sockets
:required: false
:display: :edit
:default: 1
:data_type: :integer
Все диалоги развёртывания определены в гемах провайдеров: miq_dialogs. Оригинальные диалоги недоступны для редактирования через веб-интерфейс MIQ.
Быстрое решение
- Сделайте копию диалога miq_provision_vmware_dialogs_template (/Automation/Automate/Customization/Provisioning Dialogs/Sample VM Provisioning Dialog (Template)) изменив префикс имени, например: ze_provision_vmware_dialogs_template;
- Сделайте копию метода /Infrastructure/VM/Provisioning/Profile/vm_dialog_name_prefix, измените его чтобы возвращался Ваш префикс (строка 18);
- Отредактируйте свой новый диалог, добавьте требуемые значения параметров.
Дополнительно
Прямое перечисление конкретных значений не всегда удобно (их может быть много), поэтому списки значений можно подгружать из методов. Посмотрите, как определены возможные значения для количества VM, – их нет. Вместо этого указан метод allowed_number_of_vms и параметр для его работы max:
:number_of_vms:
:values_from:
:options:
:max: 50
:method: :allowed_number_of_vms
:description: Count
:required: false
:display: :edit
:default: 1
:data_type: :integer
Метод allowed_number_of_vms находится в файле /var/www/miq/vmdb/app/models/miq_provision_virt_workflow.rb. Можно создать alias этого метода и/или написать свои методы, возвращающие допустимые значения для параметров VM (обратите внимание, что для значений памяти должны возвращаться строки):
# возвращает допустимые значения количества vCPU
alias_method "allowed_number_of_vcpu", "allowed_number_of_vms"
# возвращает допустимые значения объёма памяти VM
# на вход принимает параметр max >= 24, по умолчанию max = 64
# 1, 2, 3, далее с шагом 2 ГиБ: 4, 6, 8 .. 24, далее с шагом 4 ГиБ: 28, 32 .. max
# на выходе массив строк ["1024" => "1024", "2048" => "2048"...]
def allowed_size_of_memory(options = {max: 64})
max = options[:max].to_i
max = 24 if max < 24
values = [1, 2, 3, (4..22).step(2).to_a, (24..max).step(4).to_a].flatten
values.each_with_object({}) { |i, h| h[(i * 1024).to_s] = (i * 1024).to_s }
end
Поля в коде диалога, использующие данные методы могут выглядеть так:
...
:number_of_sockets:
:values_from:
:options:
:max: 16
:method: :allowed_number_of_vcpu
:description: Number of Sockets
:required: false
:display: :edit
:default: 1
:data_type: :integer
...
:vm_memory:
:values_from:
:options:
:max: 64
:method: :allowed_size_of_memory
:description: Memory (GB)
:required: false
:display: :edit
:default: '1024'
:data_type: :string
Внимание! Внесение изменений в исходном коде потребует перезапуска сервера для их применения, также потребуется вносить эти изменения в код заново после каждого обновления MIQ.
Файлы к статье
manageiq-vm-props.zip – полный код доработанного скрипта и диалога.