function pool_update($pool) { if (xvp_db_user_rights(null, $pool) == "none") { $pool->poolname = false; return; } if (($session = xenapi_login($pool, $master_ref)) === false) { return; } $pool->session = $session; if (xvp_db_user_host_rights($pool) == "none") { foreach ($pool->hosts as $host) { $host->hostname = false; } } else { foreach ($pool->hosts as $host) { host_update($pool, $host, $session, $master_ref); } } foreach ($pool->vms as $vm) { vm_update($pool, $vm, $session); } }
function pool_update($pool) { if (xvp_db_user_rights(null, $pool) == "none") { $pool->poolname = false; return; } if (($session = xenapi_login($pool, $master_ref)) === false) { return; } $pool->session = $session; if (xvp_db_user_host_rights($pool) == "none") { foreach ($pool->hosts as $host) { $host->hostname = false; } } else { // We used to make lots of per-host Xen API calls, but grabbing // the details for all hosts in 2 calls should be much faster $allhosts = xenapi_host_get_all_records($session); $allhostmetrics = xenapi_host_metrics_get_all_records($session); $hostsbyuuid = array(); foreach ($allhosts as $ref => $oid) { $hostobj_r = $oid->scalarval(); $hostmref = $hostobj_r["metrics"]->scalarval(); $hostuuid = $hostobj_r["uuid"]->scalarval(); $hostname = $hostobj_r["hostname"]->scalarval(); $hostaddr = $hostobj_r["address"]->scalarval(); $hostenabled = $hostobj_r["enabled"]->scalarval(); $swversion = $hostobj_r["software_version"]->scalarval(); $hostversion = $swversion["product_version"]->scalarval(); $hostbrand = $swversion["product_brand"]->scalarval(); $hostbuild = $swversion["build_number"]->scalarval(); $hostsbyuuid[$hostuuid]["hostname"] = $hostname; $hostsbyuuid[$hostuuid]["address"] = $hostaddr; $hostsbyuuid[$hostuuid]["enabled"] = $hostenabled; $hostsbyuuid[$hostuuid]["os_version"] = "{$hostbrand} {$hostversion} build {$hostbuild}"; $hostsbyuuid[$hostuuid]["is_master"] = $ref == $master_ref; if ($hostenabled) { $hostm = $allhostmetrics[$hostmref]->scalarval(); $hostmemtotal = $hostm["memory_total"]->scalarval(); $hostmemfree = $hostm["memory_free"]->scalarval(); $hostsbyuuid[$hostuuid]["memory_total"] = $hostmemtotal; $hostsbyuuid[$hostuuid]["memory_free"] = $hostmemfree; } } foreach ($pool->hosts as $host) { host_update($pool, $host, $session, $master_ref, $hostsbyuuid); } } // We used to make lots of per-VM Xen API calls, but grabbing // the details for all VMs in 3 calls should be much faster $allvms = xenapi_vm_get_all_records($session); $allvmmetrics = xenapi_vm_metrics_get_all_records($session); $allguestmetrics = xenapi_vm_guest_metrics_get_all_records($session); $vmsbyuuid = array(); foreach ($allvms as $oid) { $vmobj_r = $oid->scalarval(); if ($vmobj_r["is_a_template"]->scalarval() || $vmobj_r["is_control_domain"]->scalarval()) { continue; } $vmmref = $vmobj_r["metrics"]->scalarval(); $vmm = $allvmmetrics[$vmmref]->scalarval(); $vmgmref = $vmobj_r["guest_metrics"]->scalarval(); if (array_key_exists($vmgmref, $allguestmetrics)) { $vmgm = $allguestmetrics[$vmgmref]->scalarval(); } else { unset($vmgm); } $vmuuid = $vmobj_r["uuid"]->scalarval(); $vmname = $vmobj_r["name_label"]->scalarval(); $vmpower = $vmobj_r["power_state"]->scalarval(); $vmmemory = $vmm["memory_actual"]->scalarval(); $vmstarttime = $vmm["start_time"]->scalarval(); if (isset($vmgm)) { $vmmetricsos = $vmgm["os_version"]->scalarval(); $strarr = explode('|', $vmmetricsos["name"]->scalarval()); $vmosversion = $strarr[0]; // Regis's distro code doesn't work for me, Colin //$vmdistro = $vmmetricsos["distro"]->scalarval(); } else { $vmosversion = ""; } $vmsbyuuid[$vmuuid]["name"] = $vmname; $vmsbyuuid[$vmuuid]["power_state"] = $vmpower; $vmsbyuuid[$vmuuid]["memory_actual"] = $vmmemory; $vmsbyuuid[$vmuuid]["start_time"] = $vmstarttime; $vmsbyuuid[$vmuuid]["os_version"] = $vmosversion; //$vmsbyuuid[$vmuuid]["distro"] = $vmdistro; } foreach ($pool->vms as $vm) { vm_update($pool, $vm, $session, $vmsbyuuid); } }