Пример #1
0
/**
 * Hypervisor Abstractor
 *
 * abstracts virt function calls so they are executed using the relevant library for the host
 *
 * @global  resource $host_conn a libvirt host connection resource
 * @global  array    $host_info an array of host information
 *
 * param string $command virt command
 * param mixed $params command-associated parameters
 *
 * @return mixed
 */
function ace_virt()
{
    $args = func_get_args();
    global $host_conn, $host_info;
    $result = FALSE;
    $command = $args[0];
    $host_id = $args[1];
    if ($host_info['id'] !== $host_id) {
        $host_info = ace_db_host_get_info($host_id);
    }
    switch ($host_info['hypervisor']) {
        case 'kvm':
            if (!ace_kvm_host_is_connected($host_info['name'], $host_info['domain'])) {
                $host_conn = ace_kvm_connect($host_info['name'], $host_info['domain'], $host_info['username'], $host_info['password']);
            }
            if (is_resource($host_conn)) {
                switch ($command) {
                    // case 'host_hostname' :
                    //  $result = ace_kvm_host_hostname(); break;
                    // case 'host_conn_info' :
                    //  $result = ace_kvm_host_conn_info(); break;
                    case 'test_connection':
                        $result = TRUE;
                        break;
                    case 'get_log_file_tail':
                        $num_lines = $args[2];
                        $result = ace_kvm_get_log_file_tail($num_lines);
                        break;
                    case 'get_hypervisor_info':
                        $result = ace_kvm_get_hypervisor_info();
                        break;
                    case 'get_physical_info':
                        $result = ace_kvm_get_physical_info();
                        break;
                    case 'get_network_list':
                        $result = ace_kvm_get_network_list();
                        break;
                    case 'network_exists':
                        $network_virt_id = $args[2];
                        $result = ace_kvm_network_exists($network_virt_id);
                        break;
                    case 'get_network_state':
                        $network_virt_id = $args[2];
                        $result = ace_kvm_get_network_state($network_virt_id);
                        break;
                    case 'set_network_state':
                        $network_virt_id = $args[2];
                        $active = $args[3];
                        if ($active) {
                            $result = ace_kvm_network_activate_virsh($host_info['name'], $network_virt_id);
                        } else {
                            $result = ace_kvm_network_deactivate_virsh($host_info['name'], $network_virt_id);
                        }
                        break;
                    case 'create_network':
                        $network_virt_id = $args[2];
                        $result = ace_kvm_network_create($host_info['name'], $network_virt_id);
                        break;
                        // case 'update_network' :				$network_virt_id = $args[2]; $result = ace_kvm_network_update($network_virt_id); break;
                    // case 'update_network' :				$network_virt_id = $args[2]; $result = ace_kvm_network_update($network_virt_id); break;
                    case 'activate_network':
                        $network_virt_id = $args[2];
                        $result = ace_kvm_network_activate_virsh($host_info['name'], $network_virt_id);
                        break;
                    case 'deactivate_network':
                        $network_virt_id = $args[2];
                        $result = ace_kvm_network_deactivate_virsh($host_info['name'], $network_virt_id);
                        break;
                    case 'delete_network':
                        $network_virt_id = $args[2];
                        $result = ace_kvm_network_delete($network_virt_id);
                        break;
                    case 'get_storage_info':
                        $result = ace_kvm_get_storage_info();
                        break;
                    case 'get_volume_list':
                        $result = ace_kvm_get_volume_list();
                        break;
                    case 'get_media_list':
                        $result = ace_kvm_get_media_list();
                        break;
                    case 'create_volume':
                        $virt_id = $args[2];
                        $size = $args[3];
                        $unit = $args[4];
                        $base_virt_id = $args[5];
                        $result = ace_kvm_volume_create($virt_id, $size, $unit, $base_virt_id);
                        break;
                        // case 'update_volume' :				$volume_virt_id = $args[2]; $result = ace_kvm_volume_update($volume_virt_id); break;
                    // case 'update_volume' :				$volume_virt_id = $args[2]; $result = ace_kvm_volume_update($volume_virt_id); break;
                    case 'delete_volume':
                        $volume_virt_id = $args[2];
                        $result = ace_kvm_volume_delete($volume_virt_id);
                        break;
                    case 'get_vm_list':
                        $result = ace_kvm_get_vm_list();
                        break;
                    case 'get_vm_state':
                        $vm_virt_id = $args[2];
                        $result = ace_kvm_get_vm_state($vm_virt_id);
                        break;
                    case 'get_vm_nics':
                        $vm_virt_id = $args[2];
                        $result = ace_kvm_vm_get_nic_array($vm_virt_id);
                        break;
                    case 'get_vm_disks':
                        $vm_virt_id = $args[2];
                        $result = ace_kvm_vm_get_disk_array($vm_virt_id);
                        break;
                        // case 'get_vm_config' :				$result = ace_kvm_get_vm_config($params); break;
                    // case 'get_vm_config' :				$result = ace_kvm_get_vm_config($params); break;
                    case 'create_vm':
                        $virt_id = $args[2];
                        $vcpu = $args[3];
                        $memory = $args[4];
                        $unit = $args[5];
                        $arch = $args[6];
                        $profile = $args[7];
                        $result = ace_kvm_vm_create($virt_id, $vcpu, $memory, $unit, $arch, $profile);
                        break;
                    case 'get_vm_console_info':
                        $vm_virt_id = $args[2];
                        $result = ace_kvm_vm_get_console_info($vm_virt_id);
                        break;
                        // case 'vm_modify' :					$result = ace_kvm_vm_modify($params); break;
                    // case 'vm_modify' :					$result = ace_kvm_vm_modify($params); break;
                    case 'delete_vm':
                        $vm_virt_id = $args[2];
                        $result = ace_kvm_vm_delete($vm_virt_id);
                        break;
                    case 'activate_vm':
                        $vm_virt_id = $args[2];
                        $result = ace_kvm_vm_start($vm_virt_id);
                        break;
                    case 'deactivate_vm':
                        $vm_virt_id = $args[2];
                        $result = ace_kvm_vm_stop($vm_virt_id);
                        break;
                    case 'shutdown_vm':
                        $vm_virt_id = $args[2];
                        $result = ace_kvm_vm_shutdown($vm_virt_id);
                        break;
                    case 'soft_reset_vm':
                        $vm_virt_id = $args[2];
                        $result = ace_kvm_vm_soft_reset($vm_virt_id, $host_info['name']);
                        break;
                        // case 'get_vm_disk_table' :			$result = ace_kvm_get_vm_disk_table($params); break;
                        // case 'vm_disk_add' :				$result = ace_kvm_vm_disk_add($params); break;
                        // case 'vm_disk_remove' :				$result = ace_kvm_vm_disk_remove($params); break;
                        // case 'get_vm_nic_table' :			$result = ace_kvm_get_vm_nic_table($params); break;
                        // case 'vm_nic_add' :					$result = ace_kvm_vm_nic_add($params); break;
                        // case 'vm_nic_remove' :				$result = ace_kvm_vm_nic_remove($params); break;
                        // case 'vm_get_media_table' :			$result = ace_kvm_get_vm_media_table($params); break;
                    // case 'get_vm_disk_table' :			$result = ace_kvm_get_vm_disk_table($params); break;
                    // case 'vm_disk_add' :				$result = ace_kvm_vm_disk_add($params); break;
                    // case 'vm_disk_remove' :				$result = ace_kvm_vm_disk_remove($params); break;
                    // case 'get_vm_nic_table' :			$result = ace_kvm_get_vm_nic_table($params); break;
                    // case 'vm_nic_add' :					$result = ace_kvm_vm_nic_add($params); break;
                    // case 'vm_nic_remove' :				$result = ace_kvm_vm_nic_remove($params); break;
                    // case 'vm_get_media_table' :			$result = ace_kvm_get_vm_media_table($params); break;
                    case 'vm_attach_cdrom':
                        $vm_virt_id = $args[2];
                        $vm_cdrom_instance = $args[3];
                        $result = ace_kvm_vm_attach_cdrom($vm_virt_id, $vm_cdrom_instance);
                        break;
                    case 'vm_detach_cdrom':
                        $vm_virt_id = $args[2];
                        $vm_cdrom_instance = $args[3];
                        $result = ace_kvm_vm_detach_cdrom($vm_virt_id, $vm_cdrom_instance);
                        break;
                    case 'vm_cdrom_insert_media':
                        $vm_virt_id = $args[2];
                        $vm_cdrom_instance = $args[3];
                        $volume_virt_id = $args[4];
                        $result = ace_kvm_vm_cdrom_insert_media($vm_virt_id, $vm_cdrom_instance, $volume_virt_id);
                        break;
                    case 'vm_cdrom_eject_media':
                        $vm_virt_id = $args[2];
                        $vm_cdrom_instance = $args[3];
                        //$volume_virt_id = $args[4];
                        $result = ace_kvm_vm_cdrom_eject_media($vm_virt_id, $vm_cdrom_instance);
                        break;
                    case 'vm_attach_disk':
                        $vm_virt_id = $args[2];
                        $vm_disk_instance = $args[3];
                        $volume_virt_id = $args[4];
                        $result = ace_kvm_vm_attach_disk($vm_virt_id, $vm_disk_instance, $volume_virt_id);
                        break;
                    case 'vm_detach_disk':
                        $vm_virt_id = $args[2];
                        $vm_disk_instance = $args[3];
                        $result = ace_kvm_vm_detach_disk($vm_virt_id, $vm_disk_instance);
                        break;
                    case 'vm_attach_nic':
                        $vm_virt_id = $args[2];
                        //$vm_nic_instance = $args[3];
                        $vm_nic_mac_address = $args[4];
                        $result = ace_kvm_vm_attach_nic_virsh($host_info['name'], $vm_virt_id, $vm_nic_mac_address);
                        //                    $result = ace_kvm_vm_attach_nic($vm_virt_id,$vm_nic_mac_address);
                        break;
                    case 'vm_detach_nic':
                        $vm_virt_id = $args[2];
                        //$vm_nic_instance = $args[3];
                        $vm_nic_mac_address = $args[4];
                        //                    $result = ace_kvm_vm_detach_nic_virsh($host_info['name'],$vm_virt_id, $vm_nic_mac_address);
                        $result = ace_kvm_vm_detach_nic($vm_virt_id, $vm_nic_mac_address);
                        break;
                    case 'vm_nic_connect_network':
                        $vm_virt_id = $args[2];
                        $vm_nic_instance = $args[3];
                        $vm_nic_mac_address = $args[4];
                        $network_virt_id = $args[5];
                        $result = ace_kvm_vm_nic_connect_network($host_info['name'], $vm_virt_id, $vm_nic_instance, $vm_nic_mac_address, $network_virt_id);
                        break;
                    case 'vm_nic_disconnect':
                        $vm_virt_id = $args[2];
                        $vm_nic_instance = $args[3];
                        $vm_nic_mac_address = $args[4];
                        //                    $network_virt_id = $args[5];
                        //                    $result = ace_kvm_vm_nic_disconnect($vm_virt_id, $vm_nic_instance, $vm_nic_mac_address, $network_virt_id);
                        //                    $result = ace_kvm_vm_nic_disconnect_patch($host_info['name'],$vm_virt_id, $vm_nic_instance, $vm_nic_mac_address, $network_virt_id);
                        $result = ace_kvm_vm_nic_connect_network($host_info['name'], $vm_virt_id, $vm_nic_instance, $vm_nic_mac_address, _DISCONNECTED_VIRT_NETWORK_ID_);
                        break;
                    case 'vm_nic_get_link_state':
                        $vm_virt_id = $args[2];
                        $vm_nic_mac_address = $args[3];
                        $result = ace_kvm_vm_nic_get_link_state($vm_virt_id, $vm_nic_mac_address);
                        break;
                    case 'vm_nic_link_up':
                        $vm_virt_id = $args[2];
                        $vm_nic_mac_address = $args[3];
                        $result = ace_kvm_vm_nic_link_up($vm_virt_id, $vm_nic_mac_address);
                        break;
                    case 'vm_nic_link_down':
                        $vm_virt_id = $args[2];
                        $vm_nic_mac_address = $args[3];
                        $result = ace_kvm_vm_nic_link_down($vm_virt_id, $vm_nic_mac_address);
                        break;
                    case 'vm_screenshot':
                        $vm_virt_id = $args[2];
                        $max_width = $args[3];
                        $result = ace_kvm_vm_screenshot($vm_virt_id, $host_info['name'], $max_width);
                        break;
                    case 'vm_get_snapshot_list':
                        $vm_virt_id = $args[2];
                        $result = ace_kvm_vm_get_snapshot_list($vm_virt_id);
                        break;
                    case 'vm_create_snapshot':
                        $vm_virt_id = $args[2];
                        $result = ace_kvm_vm_create_snapshot($vm_virt_id);
                        break;
                    case 'vm_snapshot_revert':
                        $vm_virt_id = $args[2];
                        $vm_snapshot_instance = $args[3];
                        $result = ace_kvm_vm_snapshot_revert($vm_virt_id, $vm_snapshot_instance);
                        break;
                    case 'vm_snapshot_delete':
                        $vm_virt_id = $args[2];
                        $vm_snapshot_instance = $args[3];
                        $result = ace_kvm_vm_snapshot_delete($vm_virt_id, $vm_snapshot_instance);
                        break;
                }
            } else {
                return FALSE;
            }
            break;
        case 'xen':
            switch ($command) {
                case 'vm_create':
                    //$result = ace_xen_vm_create($params);
                    break;
                    #e.g.
            }
            break;
        case 'hyperv':
            switch ($command) {
                case 'vm_create':
                    //$result = ace_hyperv_vm_create($params);
                    break;
                    #e.g.
            }
            break;
    }
    return $result;
}
Пример #2
0
/**
 * revert to a snapshot of a virtual machine on the virt host
 *
 * @todo TIDY UP to remove bugged code
 *
 * @global  resource $host_conn                         libvirt connection
 *
 * @param   string   $vm_virt_id                        virt_id of the vm
 * @param   int      $vm_snapshot_instance_to_revert_to snapshot instance
 *
 * @return  bool                on success
 */
function ace_kvm_vm_snapshot_revert($vm_virt_id, $vm_snapshot_instance_to_revert_to)
{
    global $host_conn;
    $vm_res = libvirt_domain_lookup_by_name($host_conn, $vm_virt_id);
    ace_kvm_log_last_error();
    $vm_snapshot_list = ace_kvm_vm_get_snapshot_list($vm_virt_id);
    $num_vm_snapshots = count($vm_snapshot_list);
    $max_snapshot_instance = $num_vm_snapshots - 1;
    if ($num_vm_snapshots > 0 && $vm_snapshot_instance_to_revert_to >= 0 && $vm_snapshot_instance_to_revert_to <= $max_snapshot_instance) {
        $vm_snapshot_name_to_revert_to = $vm_snapshot_list[$vm_snapshot_instance_to_revert_to];
        $vm_snapshot_res_to_revert_to = libvirt_domain_snapshot_lookup_by_name($vm_res, $vm_snapshot_name_to_revert_to);
        ace_kvm_log_last_error();
        $revert_result = libvirt_domain_snapshot_revert($vm_snapshot_res_to_revert_to);
        ace_kvm_log_last_error();
        # resume, since the vm was 'paused' when the snapshot was taken
        ace_kvm_vm_resume($vm_virt_id);
        # then stop, since we only work with snapshots when vm is inactive
        ace_kvm_vm_stop($vm_virt_id);
        # if $vm_snapshot_instance < $num_snaps then delete snap[instance+1]-with children
        # if (($num_vm_snapshots > 0) && ($vm_snapshot_instance < ($num_vm_snapshots - 1))) {
        if ($vm_snapshot_instance_to_revert_to < $max_snapshot_instance) {
            $all_delete_results = TRUE;
            for ($i = $max_snapshot_instance; $i > $vm_snapshot_instance_to_revert_to; $i--) {
                $vm_snapshot_name_to_delete = $vm_snapshot_list[$i];
                $vm_snapshot_res_to_delete = libvirt_domain_snapshot_lookup_by_name($vm_res, $vm_snapshot_name_to_delete);
                ace_kvm_log_last_error();
                $delete_result = libvirt_domain_snapshot_delete($vm_snapshot_res_to_delete);
                ace_kvm_log_last_error();
                $all_delete_results = $all_delete_results && $delete_result;
            }
            # the following FAILS - it has to do with the children flag
            //$result = libvirt_domain_snapshot_delete($vm_snapshot_res_to_delete,VIR_SNAPSHOT_DELETE_CHILDREN);
            #$result = libvirt_domain_snapshot_delete($vm_snapshot_res_to_delete);
            //ace_kvm_log_error();
        } else {
            $all_delete_results = TRUE;
        }
    } else {
        $revert_result = FALSE;
    }
    return $revert_result && $all_delete_results;
}