В прошлый раз мы разбирались с управлением ресурсами: vRA: управление ресурсами. Сегодня также играем с резервированиями в vRA, только уже со стороны программного управления: через vRealize Orchestrator. А поскольку задачи у всех разные и готовых решений для каждого случая нет, то просто приведу список “базовых” рецептов для получения нужных объектов и данных.
Стандартными входными параметрами для всех последующих примеров будет один из хостов:
vcacCAFEHost – vCACCAFE:VCACHost – vRA host
vcacHost – vCAC:VCACHost – vRA IaaS Host
Остальные входные параметры смотрите по тексту примеров.
Списки резервирований и политик
1. Получить список имен всех резервирований:
reservationNames = System.getModule("com.vmware.library.vcac").getReservationNames(vcacHost);
2. Получить список резервирований с выводом имён и ID:
var reservations = vCACCAFEEntitiesFinder.getReservations(vcacCAFEHost); for each (reservation in reservations) { System.log(reservation.name); System.log(reservation.id); }
3. Поиск резервирования по имени:
var reservationName = "testReservation01"; var reservations = vCACCAFEEntitiesFinder.getReservations(vcacCAFEHost); for each (reservation in reservations) { if (reservation.name === reservationName) { return reservation; } } return null;
4. Получение резервирования по его ID:
var reservationId = "abababab-bcbc-cdcd-1111-222233334444"; var reservation = vCACCAFEEntitiesFinder.getReservation(vcacCAFEHost, reservationId);
5. Список политик резервирования:
var reservationsPolicies = vCACCAFEEntitiesFinder.getReservationPolicies(vcacCAFEHost); for each (rPolicy in reservationsPolicies) { if (rPolicy.reservationPolicyTypeId == 'Infrastructure.Reservation.Policy.ComputeResource') { System.log(rPolicy.name); System.log(rPolicy.id); } }
или
var client = vcacCAFEHost.createReservationClient(); var rService = client.getReservationReservationPolicyService(); var reservationPolicies = rService.getAllReservationPolicies().getContent(); for each (rPolicy in reservationPolicies) { if (rPolicy.reservationPolicyTypeId == 'Infrastructure.Reservation.Policy.ComputeResource') { System.log(rPolicy.name); System.log(rPolicy.id); } }
6. Список политик резервирования хранилищ. Для его получения нужно указать другой тип политики в reservationPolicyTypeId:
var reservationsPolicies = vCACCAFEEntitiesFinder.getReservationPolicies(vcacCAFEHost); for each (rPolicy in reservationsPolicies) { if (rPolicy.reservationPolicyTypeId == 'Infrastructure.Reservation.Policy.Storage') { System.log(rPolicy.name); System.log(rPolicy.id); } }
Получение настроек резервирований
7. Получение информации о параметрах резервирования
var reservationEntity = System.getModule("com.vmware.library.vcac").getReservationEntityByName(vcacHost,reservationName); var properties = reservationEntity.getProperties(); for each (key in properties.keys) { System.log(key + ': ' + reservationEntity.getProperty(key)); }
8. Информация о политике, используемой на резервировании
var reservationEntity = System.getModule("com.vmware.library.vcac").getReservationEntityByName(vcacHost,reservationName); var rPolicies = reservationEntity.getLink(vcacHost, "HostReservationPolicy"); if (rPolicies.length == 0) { System.log("Политика резервирования для " + reservationName + " не найдена."); } else { var rPolicyEntity = rPolicies[0]; var rPolicyName = rPolicyEntity.getProperty("name"); var rPolicyId = rPolicyEntity.getProperty("id"); System.log("Reservation Policy: " + rPolicyName); System.log("Reservation Policy ID: " + rPolicyId); }
9. Для получения более полной информации о резервировании нужно использовать класс vCACCAFEReservation и его метод getExtensionData. Возвращаемый объект (в скрипте это data) содержит много информации о настройках резервирования и имеет сложную структуру:
var reservation = vCACCAFEEntitiesFinder.getReservation(vcacCAFEHost, reservationId); var data = reservation.getExtensionData(); System.log(data); System.log(""); for each (key in data.keySet()) { System.log(key + ": " + typeof data.get(key).value); }
Объект data может содержать несколько полей простых типов (machineQuota и параметры из Custom Properties, если строки также отнести к простым), к которым можно обратиться так:
System.log("machineQuota: " + data.get("machineQuota").value);
Остальная информация вся сразу нужна очень редко, а получить отдельные объекты и настройки Вам поможет следующий скрипт:
var reservation = vCACCAFEEntitiesFinder.getReservation(vcacCAFEHost, reservationId); var data = reservation.getExtensionData(); System.log("### Storages"); var reservationStorages = data.get("reservationStorages"); for each(storage in reservationStorages.getValue()) { writeData(storage.getValue()); } System.log("### Networks"); var reservationNetworks = data.get("reservationNetworks"); for each(network in reservationNetworks.getValue()) { writeData(network.getValue()); } System.log("### Memory"); writeData(data.get("reservationMemory").getValue()); function writeData(data){ for each (key in data.keySet()) { if (typeof data.get(key).value == "function") { System.log(key + ": " + data.get(key).value.getLabel()); } else System.log(key + ": " + data.get(key).value) } }
Готовые рецепты
10. Получить список всех блюпринтов, размещение которых ограничено заданной политикой:
var rPolicyName = "myPolicy"; var rPlolicyBlueprints = []; // получаем список всех блюпринтов var blueprints = vCACCAFEEntitiesFinder.getCompositeBlueprints(vcacCAFEHost); for each (blueprint in blueprints) { for each (var key in blueprint.components.keys) { // нам нужны только компоненты - виртуальные машины if (blueprint.components.get(key).getType() == "Infrastructure.CatalogItem.Machine.Virtual.vSphere") { // проверяем значение "reservation_policy" var bp = blueprint.components.get(key).getData().get("reservation_policy"); if (bp && bp.getFacets().get("defaultValue").value.label == rPolicyName) { rPlolicyBlueprints.push(blueprint); System.log(blueprint.name); } } } }
11. Перемещение уже существующей VM в другое резервирование. Такой процесс уже имеется в оркестраторе, изобретать новый велосипед сегодня не будем. Процесс называется “Change reservation of an IaaS Virtual Machine”.
12. Получить сумму использованных/доступных ресурсов/квот для некоторого заданного списка резервирований (в моём случае была нужна сумма по некоторым бизнес-группам). На вход передаём заранее подготовленный массив reservationIds со списком ID анализируемых резервирований.
// Создаём сервис работы с резервированиями var reservationService = vcacCAFEHost.createReservationClient().getReservationReservationService(); // Получаем массив с информацией обо всех резервированиях var pageRequest = new vCACCAFEPageOdataRequest(1, Number.MAX_VALUE); var reservationInfos = reservationService.getAllReservationInfos(pageRequest).getContent(); for each (info in reservationInfos) { // если ID резервирования имеется в массиве... if (reservationIds.indexOf(info.getId()) != -1) { // получаем и суммируем данные var data = info.getExtensionData(); var result = data.get("quotaAllocatedPercentage").value.match(/\d+/g); quotaAllocated += parseInt(result[1]); quotaTotal += parseInt(result[2]); } } System.log(quotaAllocated); System.log(quotaTotal);
В примере считается суммарное значение для резервирований по установленной квоте и по её использованию: “quotaAllocatedPercentage”. Замена этого ключа на “memoryAllocatedPercentage” вернет данные по использованной памяти, а “storageAllocatedPercentage” – по хранилищам.
13. Создание нового резервирования: https://communities.vmware.com/message/2703490#2703490
Думаю, что этого более чем достаточно для начала разработки собственного сценария…