Найти и удалить из массива с несколькими ключами по шаблонам поиска - PullRequest
0 голосов
/ 03 июля 2019

Я преобразую свои скрипты PowerShell (PowerCLI) в коды JavaScript ES5, чтобы их можно было запускать в vRealize Orchestrator.Я пытаюсь найти список виртуальных машин с тонкой подготовкой.В PowerCLI я получаю массив объектов под названием «$ result» со следующим набором столбцов -

+----------------+---------------+-------------+---------+------+-------------+  
| VM             | Datastore     | Disk        | Size_GB | Thin | vCenter     |  
+----------------+---------------+-------------+---------+------+-------------+  
| TLAPP021       | L03VM1        | Hard Disk 1 | 40      | True | l03vcenter  |  
| TLSQL003-test  | L03VM1        | Hard Disk 1 | 40      | True | l03vcenter  |  
| RLT00021       | L03VM2        | Hard Disk 2 | 90      | True | l03vcenter  |  
| RLTC0201       | local-L03     | Hard Disk 1 | 40      | True | l03vcenter  |  
| TLAPP022       | L04VM1        | Hard Disk 3 | 140     | True | l04vcenter  |  
| TLAPP022-clone | L04VM1        | Hard Disk 1 | 20      | True | l04vcenter  |  
| TLVMW023       | BRIDGE        | Hard Disk 5 | 90      | True | l03vcenter  |  
| RL000001       | TESTLAB       | Hard Disk 4 | 60      | True | l03vcenter  |  
| RLT00028       | L04VM1        | Hard Disk 1 | 40      | True | l04vcenter  |  
| RLT00028-bku   | L04VM1        | Hard Disk 1 | 40      | True | l04vcenter  |  
| TLADS007       | L03VM2        | Hard Disk 2 | 50      | True | l03vcenter  |  
+----------------+---------------+-------------+---------+------+-------------+ 

, которые я затем отфильтрую на основе «ВМ», не такой-то и такой-то шаблон -

$result | where-object {($_.VM -notlike "expand*") -and ($_.VM -notlike "*clone") -and ($_.VM -notlike "*bku") -and ($_.VM -notlike "*test")}

Затем я отфильтровываю на основе «Datastore», не такой-то и такой-то шаблон -

$result | where-object {($_.datastore -notlike "*local-*") -and ($_.datastore -notlike "[BRIDGE]*") -and ($_.datastore -notlike "[TESTLAB]*")}

И я получаю следующие объекты в $ result -

+----------------+---------------+-------------+---------+------+-------------+  
| VM             | Datastore     | Disk        | Size_GB | Thin | vCenter     |  
+----------------+---------------+-------------+---------+------+-------------+  
| TLAPP021       | L03VM1        | Hard Disk 1 | 40      | True | l03vcenter  |  
| RLT00021       | L03VM2        | Hard Disk 2 | 90      | True | l03vcenter  | 
| TLAPP022       | L04VM1        | Hard Disk 3 | 140     | True | l04vcenter  |  
| RLT00028       | L04VM1        | Hard Disk 1 | 40      | True | l04vcenter  |  
| TLADS007       | L03VM2        | Hard Disk 2 | 50      | True | l03vcenter  |  
+----------------+---------------+-------------+---------+------+-------------+  

Затем я сортирую свой результат $ сначала по "vCenter", затем по "VM", затем по "Datastore", а затем по "Disk"

Это то, что я сейчас придумал в JS -

var Result = [];
var vcs = VcPlugin.allSdkConnections;
for each(var vc in vcs) 
{
    var vms = vc.getAllVirtualMachines()
    for each(var vm in vms) 
    {
        var devices = vm.config.hardware.device;
        for each(var device in devices) 
        {
            if (device.deviceInfo.label.match(/Hard.*/))
            {
                if (device.backing.thinProvisioned)
                {
                    Result.push({
                        VM: vm.name,
                        Datastore: device.backing.fileName.split(" ")[0],
                        Disk: device.deviceInfo.label,
                        Size_GB: (device.capacityInKB/1048576).toFixed(2),
                        Thin: device.backing.thinProvisioned,
                        vCenter: vc.name.split(":")[1].substring(2)
                    });
                }
            }   
        }
    }
}

Result = Result.sort(function(a, b) 
{
    if(a.vCenter < b.vCenter)
    {
        return -1;  
    }
    else if(a.vCenter > b.vCenter)
    {
        return 1;
    }
    else
    {
        if(a.VM < b.VM)
        {
           return -1
        }
        else if(a.VM > b.VM)
        {
          return 1;
        }
        else
        {
            if(a.Datastore < b.Datastore)
            {
               return -1
            }
            else if(a.Datastore > b.Datastore)
            {
              return 1;
            }
            else
            {
                if(a.Disk < b.Disk)
                {
                   return -1
                }
                else if(a.Disk > b.Disk)
                {
                  return 1;
                }
                else
                {
                  return 0;
                }
            }
        }
    }
});

Я изо всех сил пытаюсь отфильтровать материал из переменной "Result" с помощью шаблона, соответствующего ключам "VM" и "Datastore".

Я искал много решений, но так как он в ES6или более новая версия, она не работает в VRO.Мне нужен ES5-совместимый код.

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Вот решение, которое почти уже есть (что-то вроде вопроса).Обратите внимание на использование Array.prototype.reduce() для согласования списка с двумя разными подзапросами.Также обратите внимание на использование String.prototype.localeCompare(), используемого для компаратора строк в функции сортировки.

Мне неясно, какие результаты будут получены в отсортированных результатах.Если вы предоставите желаемый отсортированный вывод, я могу подтвердить, что я достиг вашей цели.

Код прокомментирован ниже:

var VMSearchExp = ["^expand", "clone$", "bku$", "test$"];
var DatastoreExp = ["local-L03", "^BRIDGE", "^TESTLAB"];
var data = [
{VM:  "TLAPP021", Datastore: "L03VM1",  Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l03vcenter" },
{VM:  "TLSQL003-test", Datastore: "L03VM1",  Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l03vcenter" },
{VM:  "RLT00021", Datastore: "L03VM2",  Disk:"Hard Disk 2",Size_GB:90, Thin: true, vCenter: "l03vcenter" },
{VM:  "RLTC0201", Datastore: "local-L03",  Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l03vcenter" },
{VM:  "TLAPP022", Datastore: "L04VM1",  Disk:"Hard Disk 3",Size_GB:140, Thin: true, vCenter: "l04vcenter" },
{VM:  "TLAPP022-clone", Datastore: "L04VM1",  Disk:"Hard Disk 1",Size_GB:20, Thin: true, vCenter: "l04vcenter" },
{VM:  "TLVMW023", Datastore: "BRIDGE",  Disk:"Hard Disk 5",Size_GB:90, Thin: true, vCenter: "l03vcenter" },
{VM:  "RL000001", Datastore: "TESTLAB",  Disk:"Hard Disk 4",Size_GB:60, Thin: true, vCenter: "l03vcenter" },
{VM:  "RLT00028", Datastore: "L04VM1",  Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l04vcenter" },
{VM:  "RLT00028-bku", Datastore: "L04VM1",  Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l04vcenter" },
{VM:  "TLADS007", Datastore: "L03VM2",  Disk:"Hard Disk 2",Size_GB:50, Thin: true, vCenter: "l03vcenter" }
];
// Clone the orginal
var dataCopy = JSON.parse(JSON.stringify(data));
// Reduce the clone to exclude the VMSearchExps
dataCopy = VMSearchExp.reduce(function(acc,exp){dataCopy = dataCopy.filter(d=>!d.VM.match(exp)); return dataCopy}, VMSearchExp[0]);
console.log("Count 8: Originally 11: ",dataCopy);
// Reduce the clone to exclude the DatastoreExps
dataCopy = DatastoreExp.reduce(function(acc,exp){dataCopy = dataCopy.filter(d=>!d.Datastore.match(exp)); return dataCopy},DatastoreExp[0]);
console.log("Count 5: Originally 8: ",dataCopy);
// Sort: if any of a.[vCenter,VM,Datastore,Disk] comes before any of those in b -> promote it
result = dataCopy.sort(function(a,b) {
                         a.vCenter.localeCompare(b.vCenter) || 
                         a.VM.localeCompare(b.VM) || 
                         a.Datastore.localeCompare(b.Datastore) || 
                         a.Disk.localeCompare(b.Disk)
                        });
// Sorted result                        
console.log("Sorted: ",result);
0 голосов
/ 05 июля 2019

Спасибо, Рэнди! Я использовал Bable для преобразования вашего кода в ES5, и с некоторой оптимизацией это сработало -

var VMSearchExp = ["^expand", "clone$", "bku$", "test$"];
var DatastoreExp = ["^local", "^BRIDGE", "^TESTLAB"];
var data = [
{VM:  "TLAPP021", Datastore: "L03VM1",  Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l03vcenter" },
{VM:  "TLSQL003-test", Datastore: "L03VM1",  Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l03vcenter" },
{VM:  "RLT00021", Datastore: "L03VM2",  Disk:"Hard Disk 2",Size_GB:90, Thin: true, vCenter: "l03vcenter" },
{VM:  "RLTC0201", Datastore: "local-L03",  Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l03vcenter" },
{VM:  "TLAPP022", Datastore: "L04VM1",  Disk:"Hard Disk 3",Size_GB:140, Thin: true, vCenter: "l04vcenter" },
{VM:  "TLAPP022-clone", Datastore: "L04VM1",  Disk:"Hard Disk 1",Size_GB:20, Thin: true, vCenter: "l04vcenter" },
{VM:  "TLVMW023", Datastore: "BRIDGE",  Disk:"Hard Disk 5",Size_GB:90, Thin: true, vCenter: "l03vcenter" },
{VM:  "RL000001", Datastore: "TESTLAB",  Disk:"Hard Disk 4",Size_GB:60, Thin: true, vCenter: "l03vcenter" },
{VM:  "RLT00028", Datastore: "L04VM1",  Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l04vcenter" },
{VM:  "RLT00028-bku", Datastore: "L04VM1",  Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l04vcenter" },
{VM:  "TLADS007", Datastore: "L03VM2",  Disk:"Hard Disk 2",Size_GB:50, Thin: true, vCenter: "l03vcenter" }
];

var dataCopy = JSON.parse(JSON.stringify(data));

dataCopy = VMSearchExp.reduce(function (acc,exp) 
{
    dataCopy = dataCopy.filter(function (d) 
    {
        return !d.VM.match(exp);
    })
    return dataCopy;
}, VMSearchExp[0]);

dataCopy = DatastoreExp.reduce(function (acc,exp)
{
    dataCopy = dataCopy.filter(function (d)
    {
        return !d.Datastore.match(exp);
    })
    return dataCopy;
}, DatastoreExp[0]);

var result = dataCopy.sort(function (a,b)
{
    return a.vCenter.localeCompare(b.vCenter) || 
    a.VM.localeCompare(b.VM) || 
    a.Datastore.localeCompare(b.Datastore) || 
    a.Disk.localeCompare(b.Disk);
});

Вот вывод -

[INFO] Input:
[INFO] VM:- TLAPP021 Datastore:- L03VM1 Disk:- Hard Disk 1 Size_GB:- 40 Thin:- true vCenter:- l03vcenter
[INFO] VM:- TLSQL003-test Datastore:- L03VM1 Disk:- Hard Disk 1 Size_GB:- 40 Thin:- true vCenter:- l03vcenter
[INFO] VM:- RLT00021 Datastore:- L03VM2 Disk:- Hard Disk 2 Size_GB:- 90 Thin:- true vCenter:- l03vcenter
[INFO] VM:- RLTC0201 Datastore:- local-L03 Disk:- Hard Disk 1 Size_GB:- 40 Thin:- true vCenter:- l03vcenter
[INFO] VM:- TLAPP022 Datastore:- L04VM1 Disk:- Hard Disk 3 Size_GB:- 140 Thin:- true vCenter:- l04vcenter
[INFO] VM:- TLAPP022-clone Datastore:- L04VM1 Disk:- Hard Disk 1 Size_GB:- 20 Thin:- true vCenter:- l04vcenter
[INFO] VM:- TLVMW023 Datastore:- BRIDGE Disk:- Hard Disk 5 Size_GB:- 90 Thin:- true vCenter:- l03vcenter
[INFO] VM:- RL000001 Datastore:- TESTLAB Disk:- Hard Disk 4 Size_GB:- 60 Thin:- true vCenter:- l03vcenter
[INFO] VM:- RLT00028 Datastore:- L04VM1 Disk:- Hard Disk 1 Size_GB:- 40 Thin:- true vCenter:- l04vcenter
[INFO] VM:- RLT00028-bku Datastore:- L04VM1 Disk:- Hard Disk 1 Size_GB:- 40 Thin:- true vCenter:- l04vcenter
[INFO] VM:- TLADS007 Datastore:- L03VM2 Disk:- Hard Disk 2 Size_GB:- 50 Thin:- true vCenter:- l03vcenter
[INFO] Count 8: Originally 11: 
[INFO] VM:- TLAPP021 Datastore:- L03VM1 Disk:- Hard Disk 1 Size_GB:- 40 Thin:- true vCenter:- l03vcenter
[INFO] VM:- RLT00021 Datastore:- L03VM2 Disk:- Hard Disk 2 Size_GB:- 90 Thin:- true vCenter:- l03vcenter
[INFO] VM:- RLTC0201 Datastore:- local-L03 Disk:- Hard Disk 1 Size_GB:- 40 Thin:- true vCenter:- l03vcenter
[INFO] VM:- TLAPP022 Datastore:- L04VM1 Disk:- Hard Disk 3 Size_GB:- 140 Thin:- true vCenter:- l04vcenter
[INFO] VM:- TLVMW023 Datastore:- BRIDGE Disk:- Hard Disk 5 Size_GB:- 90 Thin:- true vCenter:- l03vcenter
[INFO] VM:- RL000001 Datastore:- TESTLAB Disk:- Hard Disk 4 Size_GB:- 60 Thin:- true vCenter:- l03vcenter
[INFO] VM:- RLT00028 Datastore:- L04VM1 Disk:- Hard Disk 1 Size_GB:- 40 Thin:- true vCenter:- l04vcenter
[INFO] VM:- TLADS007 Datastore:- L03VM2 Disk:- Hard Disk 2 Size_GB:- 50 Thin:- true vCenter:- l03vcenter
[INFO] Count 5: Originally 8: 
[INFO] VM:- TLAPP021 Datastore:- L03VM1 Disk:- Hard Disk 1 Size_GB:- 40 Thin:- true vCenter:- l03vcenter
[INFO] VM:- RLT00021 Datastore:- L03VM2 Disk:- Hard Disk 2 Size_GB:- 90 Thin:- true vCenter:- l03vcenter
[INFO] VM:- TLAPP022 Datastore:- L04VM1 Disk:- Hard Disk 3 Size_GB:- 140 Thin:- true vCenter:- l04vcenter
[INFO] VM:- RLT00028 Datastore:- L04VM1 Disk:- Hard Disk 1 Size_GB:- 40 Thin:- true vCenter:- l04vcenter
[INFO] VM:- TLADS007 Datastore:- L03VM2 Disk:- Hard Disk 2 Size_GB:- 50 Thin:- true vCenter:- l03vcenter
[INFO] Sorted: 
[INFO] VM:- RLT00021 Datastore:- L03VM2 Disk:- Hard Disk 2 Size_GB:- 90 Thin:- true vCenter:- l03vcenter
[INFO] VM:- TLADS007 Datastore:- L03VM2 Disk:- Hard Disk 2 Size_GB:- 50 Thin:- true vCenter:- l03vcenter
[INFO] VM:- TLAPP021 Datastore:- L03VM1 Disk:- Hard Disk 1 Size_GB:- 40 Thin:- true vCenter:- l03vcenter
[INFO] VM:- RLT00028 Datastore:- L04VM1 Disk:- Hard Disk 1 Size_GB:- 40 Thin:- true vCenter:- l04vcenter
[INFO] VM:- TLAPP022 Datastore:- L04VM1 Disk:- Hard Disk 3 Size_GB:- 140 Thin:- true vCenter:- l04vcenter
 => undefined
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...