В прошлый раз мы разбирались с управлением ресурсами: 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
Думаю, что этого более чем достаточно для начала разработки собственного сценария…