コード例 #1
0
function create_clone_lvm_nfs_deployment($cloud_image_id, $image_clone_name, $disk_size)
{
    global $OPENQRM_SERVER_BASE_DIR;
    global $OPENQRM_SERVER_IP_ADDRESS;
    global $OPENQRM_EXEC_PORT;
    global $RESOURCE_INFO_TABLE;
    global $event;
    $event->log("create_clone", $_SERVER['REQUEST_TIME'], 5, "lvm-nfs-deployment-cloud-hook", "Creating clone of image on storage", "", "", 0, 0, 0);
    // we got the cloudimage id here, get the image out of it
    $cloudimage = new cloudimage();
    $cloudimage->get_instance_by_id($cloud_image_id);
    // get image, this is already the new logical clone
    // we just need to physical snapshot it and update the rootdevice
    $image = new image();
    $image->get_instance_by_id($cloudimage->image_id);
    $image_id = $image->id;
    $image_name = $image->name;
    $image_type = $image->type;
    $image_version = $image->version;
    $image_rootdevice = $image->rootdevice;
    $image_rootfstype = $image->rootfstype;
    $image_storageid = $image->storageid;
    $image_isshared = $image->isshared;
    $image_comment = $image->comment;
    $image_capabilities = $image->capabilities;
    $image_deployment_parameter = $image->deployment_parameter;
    // get image storage
    $storage = new storage();
    $storage->get_instance_by_id($image_storageid);
    $storage_resource_id = $storage->resource_id;
    // get storage resource
    $resource = new resource();
    $resource->get_instance_by_id($storage_resource_id);
    $resource_id = $resource->id;
    $resource_ip = $resource->ip;
    $full_vol_name = $image_rootdevice;
    $vol_dir = dirname($full_vol_name);
    $vol = str_replace("/", "", $vol_dir);
    $image_location_name = basename($full_vol_name);
    // set default snapshot size
    if (!strlen($disk_size)) {
        $disk_size = 5000;
    }
    // update the image rootdevice parameter
    $image->get_instance_by_id($image_id);
    $ar_image_update = array('image_rootdevice' => "/{$vol}/{$image_clone_name}");
    $image->update($image_id, $ar_image_update);
    $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "lvm-nfs-deployment-cloud-hook", "Updating rootdevice of image {$image_id} / {$image_name} with /{$vol}/{$image_clone_name}", "", "", 0, 0, 0);
    $image_clone_cmd = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/lvm-storage/bin/openqrm-lvm-storage snap -n " . $image_location_name . " -v " . $vol . " -t lvm-nfs-deployment -s " . $image_clone_name . " -m " . $disk_size . " --openqrm-cmd-mode background";
    $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "lvm-nfs-deployment-cloud-hook", "Running : {$image_clone_cmd}", "", "", 0, 0, 0);
    $resource->send_command($resource_ip, $image_clone_cmd);
}
コード例 #2
0
function create_clone_iscsi_deployment($cloud_image_id, $image_clone_name, $disk_size)
{
    global $OPENQRM_SERVER_BASE_DIR;
    global $OPENQRM_SERVER_IP_ADDRESS;
    global $OPENQRM_EXEC_PORT;
    global $RESOURCE_INFO_TABLE;
    global $event;
    $event->log("create_clone", $_SERVER['REQUEST_TIME'], 5, "iscsi-deployment-cloud-hook", "Creating clone of image on storage", "", "", 0, 0, 0);
    // we got the cloudimage id here, get the image out of it
    $cloudimage = new cloudimage();
    $cloudimage->get_instance_by_id($cloud_image_id);
    // get image, this is already the new logical clone
    // we just need to physical snapshot it and update the rootdevice
    $image = new image();
    $image->get_instance_by_id($cloudimage->image_id);
    $image_id = $image->id;
    $image_name = $image->name;
    $image_type = $image->type;
    $image_version = $image->version;
    $image_rootdevice = $image->rootdevice;
    $image_rootfstype = $image->rootfstype;
    $image_storageid = $image->storageid;
    $image_isshared = $image->isshared;
    $image_comment = $image->comment;
    $image_capabilities = $image->capabilities;
    $image_deployment_parameter = $image->deployment_parameter;
    // get image storage
    $storage = new storage();
    $storage->get_instance_by_id($image_storageid);
    $storage_resource_id = $storage->resource_id;
    // get storage resource
    $resource = new resource();
    $resource->get_instance_by_id($storage_resource_id);
    $resource_id = $resource->id;
    $resource_ip = $resource->ip;
    // generate a new image password for the clone
    $image->get_instance_by_id($image_id);
    $image_password = $image->generatePassword(12);
    $image->set_deployment_parameters("IMAGE_ISCSI_AUTH", $image_password);
    $image_location = dirname($image_rootdevice);
    $image_location_name = basename($image_location);
    // update the image rootdevice parameter
    $ar_image_update = array('image_rootdevice' => "/dev/{$image_clone_name}/1");
    $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "iscsi-deployment-cloud-hook", "Updating rootdevice of image {$image_id} / {$image_name} with /dev/{$image_clone_name}/1", "", "", 0, 0, 0);
    $image->update($image_id, $ar_image_update);
    $image_clone_cmd = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/iscsi-storage/bin/openqrm-iscsi-storage snap -n " . $image_location_name . " -s " . $image_clone_name . " -i " . $image_password . " --openqrm-cmd-mode background";
    $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "iscsi-deployment-cloud-hook", "Running : {$image_clone_cmd}", "", "", 0, 0, 0);
    $resource->send_command($resource_ip, $image_clone_cmd);
}
コード例 #3
0
function create_clone_kvm_gluster_deployment($cloud_image_id, $image_clone_name, $disk_size)
{
    global $OPENQRM_SERVER_BASE_DIR;
    global $OPENQRM_SERVER_IP_ADDRESS;
    global $OPENQRM_EXEC_PORT;
    global $RESOURCE_INFO_TABLE;
    global $event;
    // we got the cloudimage id here, get the image out of it
    $cloudimage = new cloudimage();
    $cloudimage->get_instance_by_id($cloud_image_id);
    $event->log("create_clone_kvm_gluster_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-gluster-deployment-cloud-hook.php", "Creating clone " . $image_clone_name . " of image " . $cloudimage->image_id . " on the storage", "", "", 0, 0, 0);
    // get image, this is already the new logical clone
    // we just need to physical snapshot it and update the rootdevice
    $image = new image();
    $image->get_instance_by_id($cloudimage->image_id);
    $image_id = $image->id;
    $image_name = $image->name;
    $image_type = $image->type;
    $image_version = $image->version;
    $image_rootdevice = $image->rootdevice;
    $image_rootfstype = $image->rootfstype;
    $imageid = $image->storageid;
    $image_isshared = $image->isshared;
    $image_comment = $image->comment;
    $image_capabilities = $image->capabilities;
    $image_deployment_parameter = $image->deployment_parameter;
    // get image storage
    $storage = new storage();
    $storage->get_instance_by_id($imageid);
    $storage_resource_id = $storage->resource_id;
    // get deployment type
    $deployment = new deployment();
    $deployment->get_instance_by_id($storage->type);
    // get storage resource
    $resource = new resource();
    $resource->get_instance_by_id($storage_resource_id);
    $resource_id = $resource->id;
    $resource_ip = $resource->ip;
    // kvm-gluster-deployment
    $image->get_instance_by_id($image_id);
    $gluster_uri_arr = parse_url($image_rootdevice);
    // origin image volume name
    $origin_volume_name = basename($gluster_uri_arr['path']);
    // location of the volume (path)
    $image_location_name = str_replace('/', '', dirname($gluster_uri_arr['path']));
    // set default snapshot size
    if (!strlen($disk_size)) {
        $disk_size = 5000;
    }
    // update the image rootdevice parameter
    $ar_image_update = array('image_rootdevice' => "gluster:" . $resource->ip . "//" . $image_location_name . "/" . $image_clone_name);
    // get the vm resource
    $vm_resource = new resource();
    $vm_resource->get_instance_by_id($cloudimage->resource_id);
    // get the VM host
    $vm_host_resource = new resource();
    $vm_host_resource->get_instance_by_id($vm_resource->vhostid);
    $event->log("create_clone_kvm_gluster_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-gluster-deployment-cloud-hook.php", "Updating rootdevice of image " . $image_id . " / " . $image_name . " with " . $image_location_name . "/" . $image_clone_name, "", "", 0, 0, 0);
    $image->update($image_id, $ar_image_update);
    $image_clone_cmd = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/kvm/bin/openqrm-kvm snap -n " . $origin_volume_name . " -v " . $image_location_name . " -s " . $image_clone_name . " -m " . $disk_size . " -t " . $deployment->type . " --openqrm-cmd-mode background";
    $event->log("create_clone_kvm_gluster_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-gluster-deployment-cloud-hook.php", "Running : " . $image_clone_cmd, "", "", 0, 0, 0);
    $resource->send_command($resource->ip, $image_clone_cmd);
}
コード例 #4
0
ファイル: image-action.php プロジェクト: kelubo/OpenQRM
     $deployment_switch->get_instance_by_id($image_type);
     $image_fields["image_type"] = $deployment_switch->type;
     // unquote
     $image_deployment_parameter = $image_fields["image_deployment_parameter"];
     $image_fields["image_deployment_parameter"] = stripslashes($image_deployment_parameter);
     $image->add($image_fields);
     break;
 case 'update_image':
     $image = new image();
     if (!strlen($image_fields["image_isshared"])) {
         $image_fields["image_isshared"] = "0";
     }
     // unquote
     $image_deployment_parameter = $image_fields["image_deployment_parameter"];
     $image_fields["image_deployment_parameter"] = stripslashes($image_deployment_parameter);
     $image->update($image_id, $image_fields);
     break;
 case 'remove':
     $image = new image();
     $image->remove($image_id);
     break;
 case 'remove_by_name':
     $image = new image();
     $image->remove_by_name($image_name);
     break;
 case 'add_deployment_type':
     $deployment = new deployment();
     $deployment_fields["deployment_id"] = (int) str_replace(".", "", str_pad(microtime(true), 15, "0"));
     $deployment->add($deployment_fields);
     break;
 case 'remove_deployment_type':
コード例 #5
0
function create_clone_template_deployment($cloud_image_id, $image_clone_name, $disk_size)
{
    global $OPENQRM_SERVER_BASE_DIR;
    global $OPENQRM_SERVER_IP_ADDRESS;
    global $OPENQRM_EXEC_PORT;
    global $RESOURCE_INFO_TABLE;
    global $event;
    $event->log("create_clone", $_SERVER['REQUEST_TIME'], 5, "template_deployment-cloud-hook", "Creating clone of image on storage", "", "", 0, 0, 0);
    // we got the cloudimage id here, get the image out of it
    $cloudimage = new cloudimage();
    $cloudimage->get_instance_by_id($cloud_image_id);
    // get image, this is already the new logical clone
    // we just need to physical snapshot it and update the rootdevice
    $image = new image();
    $image->get_instance_by_id($cloudimage->image_id);
    $image_id = $image->id;
    $image_name = $image->name;
    $image_type = $image->type;
    $image_version = $image->version;
    $image_rootdevice = $image->rootdevice;
    $image_rootfstype = $image->rootfstype;
    $image_storageid = $image->storageid;
    $image_isshared = $image->isshared;
    $image_comment = $image->comment;
    $image_capabilities = $image->capabilities;
    $image_deployment_parameter = $image->deployment_parameter;
    // get image storage
    $storage = new storage();
    $storage->get_instance_by_id($image_storageid);
    $storage_resource_id = $storage->resource_id;
    // get storage resource
    $resource = new resource();
    $resource->get_instance_by_id($storage_resource_id);
    $resource_id = $resource->id;
    $resource_ip = $resource->ip;
    // template_deployment
    $image->get_instance_by_id($image_id);
    // parse the volume group info in the identifier
    $volume_group_location = dirname($image_rootdevice);
    $volume_group = basename($volume_group_location);
    $image_location_name = basename($image_rootdevice);
    // set default snapshot size
    if (!strlen($disk_size)) {
        $disk_size = 5000;
    }
    // update the image rootdevice parameter
    $ar_image_update = array('image_rootdevice' => "/dev/{$volume_group}/{$image_clone_name}");
    // For template vms we assume that the image is located on the vm-host
    // so we send the auth command to the vm-host instead of the image storage.
    // This enables using a SAN backend with dedicated volumes per vm-host which all
    // contain all "golden-images" which are used for snapshotting.
    // We do this to overcome the current lvm limitation of not supporting cluster-wide snapshots
    // get the vm resource
    $vm_resource = new resource();
    $vm_resource->get_instance_by_id($cloudimage->resource_id);
    // get the openvz host
    $vm_host_resource = new resource();
    $vm_host_resource->get_instance_by_id($vm_resource->vhostid);
    // san backend ?
    if ($vm_host_resource->id != $resource->id) {
        $event->log("create_clone_template_deployment", $_SERVER['REQUEST_TIME'], 5, "template_deployment-cloud-hook", "Image {$image_id} IS NOT available on this template host, {$resource->id} not equal {$vm_host_resource->id} !! Assuming SAN Backend", "", "", 0, 0, $appliance_id);
        // update the image storage id with the vm-host-resource
        $image_deployment = new deployment();
        $image_deployment->get_instance_by_type($image_type);
        // loop over all storage id from type $image_type
        $found_image_storage = 0;
        $storage_list_by_type = new storage();
        $storage_id_list_by_type = $storage_list_by_type->get_ids_by_storage_type($image_deployment->id);
        foreach ($storage_id_list_by_type as $storage_id_list) {
            $storage_id = $storage_id_list['storage_id'];
            $tstorage = new storage();
            $tstorage->get_instance_by_id($storage_id);
            if ($tstorage->resource_id == $vm_host_resource->id) {
                // re-create update array + new storage id
                $ar_image_update = array('image_rootdevice' => "/dev/{$volume_group}/{$image_clone_name}", 'image_storageid' => $tstorage->id);
                $event->log("create_clone_template_deployment", $_SERVER['REQUEST_TIME'], 5, "template_deployment-cloud-hook", "Updating Image {$image_id} / {$image_name} with storage id {$tstorage->id}", "", "", 0, 0, $appliance_id);
                $found_image_storage = 1;
                break;
            }
        }
        if ($found_image_storage == 0) {
            $event->log("create_clone_template_deployment", $_SERVER['REQUEST_TIME'], 2, "template_deployment-cloud-hook", "SETUP ERROR: Could not find a storage server type {$image_type} using resource {$vm_host_resource->id}. Please create one!", "", "", 0, 0, $appliance_id);
            $event->log("create_clone_template_deployment", $_SERVER['REQUEST_TIME'], 2, "template_deployment-cloud-hook", "SETUP ERROR: Not cloning image {$image_id}", "", "", 0, 0, $appliance_id);
            return;
        }
    } else {
        $event->log("create_clone_template_deployment", $_SERVER['REQUEST_TIME'], 5, "template_deployment-cloud-hook", "Image {$image_id} IS available on this template host, {$resource->id} equal {$vm_host_resource->id}", "", "", 0, 0, $appliance_id);
    }
    $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "template_deployment-cloud-hook", "Updating rootdevice of image {$image_id} / {$image_name} with /dev/{$volume_group}/{$image_clone_name}", "", "", 0, 0, 0);
    $image->update($image_id, $ar_image_update);
    $image_clone_cmd = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/template/bin/openqrm-template snap -n " . $image_location_name . " -v " . $volume_group . " -s " . $image_clone_name . " -m " . $disk_size . " --openqrm-cmd-mode background";
    $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "template_deployment-cloud-hook", "Running on {$vm_host_resource->ip} : {$image_clone_cmd}", "", "", 0, 0, 0);
    $resource->send_command($vm_host_resource->ip, $image_clone_cmd);
}
コード例 #6
0
ファイル: image.edit.class.php プロジェクト: kelubo/OpenQRM
 function edit()
 {
     $response = $this->get_response();
     $form = $response->form;
     $id = $this->response->html->request()->get('image_id');
     if ($id !== '') {
         // check password
         $pass = $form->get_request('image_password');
         if ($pass !== '' && $pass !== $form->get_request('image_password_2')) {
             $form->set_error('image_password_2', $this->lang['error_password']);
         }
         $image = new image();
         $image->get_instance_by_id($id);
         if (!$form->get_errors() && $this->response->submit()) {
             $image_password = $this->response->html->request()->get('image_password');
             $install_from_local = $this->response->html->request()->get('install_from_local');
             $transfer_to_local = $this->response->html->request()->get('transfer_to_local');
             $install_from_nfs = $this->response->html->request()->get('install_from_nfs');
             $transfer_to_nfs = $this->response->html->request()->get('transfer_to_nfs');
             $install_from_template = $this->response->html->request()->get('install_from_template');
             $image_comment = $this->response->html->request()->get('image_comment');
             $image_version = $this->response->html->request()->get('image_version');
             // update image
             $fields['image_comment'] = $image_comment;
             $fields['image_version'] = $image_version;
             $image->update($id, $fields);
             $image->get_instance_by_id($id);
             # set password if given
             if (strlen($image_password)) {
                 $image->set_root_password($id, $image_password);
             } else {
                 $CMD = "rm -f " . $this->openqrm->get('basedir') . "/web/action/image-auth/iauth." . $id . ".php";
                 exec($CMD);
             }
             // install-from-nfs
             if (strlen($install_from_nfs)) {
                 $install_from_nfs_image = new image();
                 $install_from_nfs_image->get_instance_by_id($install_from_nfs);
                 $install_from_nfs_storage = new storage();
                 $install_from_nfs_storage->get_instance_by_id($install_from_nfs_image->storageid);
                 $install_from_nfs_storage_resource = new resource();
                 $install_from_nfs_storage_resource->get_instance_by_id($install_from_nfs_storage->resource_id);
                 $install_from_nfs_storage_ip = $install_from_nfs_storage_resource->ip;
                 $install_from_nfs_storage_path = $install_from_nfs_image->rootdevice;
                 $install_from_nfs_path = $install_from_nfs_image->storageid . ":" . $install_from_nfs_storage_ip . ":" . $install_from_nfs_storage_path;
                 $image->set_deployment_parameters("IMAGE_INSTALL_FROM_NFS", $install_from_nfs_path);
             } else {
                 $image->set_deployment_parameters("IMAGE_INSTALL_FROM_NFS", "");
             }
             // transfer-to-nfs, we have to refresh the image object here
             $image->get_instance_by_id($id);
             if (strlen($transfer_to_nfs)) {
                 $transfer_to_nfs_image = new image();
                 $transfer_to_nfs_image->get_instance_by_id($transfer_to_nfs);
                 $transfer_to_nfs_storage = new storage();
                 $transfer_to_nfs_storage->get_instance_by_id($transfer_to_nfs_image->storageid);
                 $transfer_to_nfs_storage_resource = new resource();
                 $transfer_to_nfs_storage_resource->get_instance_by_id($transfer_to_nfs_storage->resource_id);
                 $transfer_to_nfs_storage_ip = $transfer_to_nfs_storage_resource->ip;
                 $transfer_to_nfs_storage_path = $transfer_to_nfs_image->rootdevice;
                 $transfer_to_nfs_path = $transfer_to_nfs_image->storageid . ":" . $transfer_to_nfs_storage_ip . ":" . $transfer_to_nfs_storage_path;
                 $image->set_deployment_parameters("IMAGE_TRANSFER_TO_NFS", $transfer_to_nfs_path);
             } else {
                 $image->set_deployment_parameters("IMAGE_TRANSFER_TO_NFS", "");
             }
             // install-from-local, we have to refresh the image object again
             $image->get_instance_by_id($id);
             if (strlen($install_from_local)) {
                 $image->set_deployment_parameters("IMAGE_INSTALL_FROM_LOCAL", $install_from_local);
             } else {
                 $image->set_deployment_parameters("IMAGE_INSTALL_FROM_LOCAL", "");
             }
             // transfer-to-local, we have to refresh the image object again
             $image->get_instance_by_id($id);
             if (strlen($transfer_to_local)) {
                 $image->set_deployment_parameters("IMAGE_TRANSFER_TO_LOCAL", $transfer_to_local);
             } else {
                 $image->set_deployment_parameters("IMAGE_TRANSFER_TO_LOCAL", "");
             }
             // reset deployment parameter INSTALL_CONFIG
             $image->set_deployment_parameters("INSTALL_CONFIG", "");
             if (strlen($install_from_template)) {
                 // redirect to install-from-template step1
                 $response->msg = 'install-from-template';
                 $response->install_from_template = $install_from_template;
             } else {
                 $response->msg = sprintf($this->lang['msg'], $image->name);
             }
             $response->image_id = $id;
         }
         $response->name = $image->name;
     } else {
         $response->msg = '';
     }
     return $response;
 }
コード例 #7
0
ファイル: operation.php プロジェクト: sherif700/ourWork
            $uploadOk1 = 1;
        } else {
            echo "File is not an image.";
            $uploadOk1 = 0;
        }
        if (!in_array($type1, $allowed_types1)) {
            $error[] = 'plz, upload image type';
        } else {
            if ($size1 > 42565433) {
                $error[] = 'plz, dun exceed the max limit of size';
            } else {
                move_uploaded_file($tmp_name1, 'images/' . $name1);
            }
        }
        if (!isset($_POST['option'])) {
            $error[] = 'plz , select a product';
        }
        if (!empty($error)) {
            $_SESSION['errors'] = $error;
            header('location: update_image.php?id=' . $_POST['id'] . '&p_id=' . $_POST['p_id']);
        } else {
            $img->image_path = $name;
            $img->image_path_1 = $name1;
            $img->product_id = $_POST['option'];
            $img->update();
            header('location: image_control.php');
        }
    } else {
        echo "you must submit the form";
    }
}
コード例 #8
0
function create_clone_kvm_lvm_deployment($cloud_image_id, $image_clone_name, $disk_size)
{
    global $OPENQRM_SERVER_BASE_DIR;
    global $OPENQRM_SERVER_IP_ADDRESS;
    global $OPENQRM_EXEC_PORT;
    global $RESOURCE_INFO_TABLE;
    global $event;
    // clone or snap cloud action
    $kvm_plugin_config = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/kvm/etc/openqrm-plugin-kvm.conf";
    $store = openqrm_parse_conf($kvm_plugin_config);
    $kvm_plugin_cloud_create_volume_action = "snap";
    if (isset($store['OPENQRM_PLUGIN_KVM_CLOUD_CREATE_VOLUME_ACTION'])) {
        if ($store['OPENQRM_PLUGIN_KVM_CLOUD_CREATE_VOLUME_ACTION'] == 'clone') {
            $kvm_plugin_cloud_create_volume_action = "clone";
        }
    }
    // we got the cloudimage id here, get the image out of it
    $cloudimage = new cloudimage();
    $cloudimage->get_instance_by_id($cloud_image_id);
    $event->log("create_clone_kvm_lvm_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-lvm-deployment-cloud-hook.php", "Creating clone " . $image_clone_name . " of image " . $cloudimage->image_id . " on the storage", "", "", 0, 0, 0);
    // get image, this is already the new logical clone
    // we just need to physical snapshot it and update the rootdevice
    $image = new image();
    $image->get_instance_by_id($cloudimage->image_id);
    $image_id = $image->id;
    $image_name = $image->name;
    $image_type = $image->type;
    $image_version = $image->version;
    $image_rootdevice = $image->rootdevice;
    $image_rootfstype = $image->rootfstype;
    $imageid = $image->storageid;
    $image_isshared = $image->isshared;
    $image_comment = $image->comment;
    $image_capabilities = $image->capabilities;
    $image_deployment_parameter = $image->deployment_parameter;
    $openqrm_admin_user = new user("openqrm");
    $openqrm_admin_user->set_user();
    // get image storage
    $storage = new storage();
    $storage->get_instance_by_id($imageid);
    $storage_resource_id = $storage->resource_id;
    // get deployment type
    $deployment = new deployment();
    $deployment->get_instance_by_id($storage->type);
    // get storage resource
    $resource = new resource();
    $resource->get_instance_by_id($storage_resource_id);
    $resource_id = $resource->id;
    $resource_ip = $resource->ip;
    // kvm-lvm-deployment
    $image->get_instance_by_id($image_id);
    // parse the volume group info in the identifier
    $volume_group_location = dirname($image_rootdevice);
    $volume_group = basename($volume_group_location);
    $image_location_name = basename($image_rootdevice);
    // set default snapshot size
    if (!strlen($disk_size)) {
        $disk_size = 5000;
    }
    // update the image rootdevice parameter
    $ar_image_update = array('image_rootdevice' => "/dev/" . $volume_group . "/" . $image_clone_name);
    // For kvm vms we assume that the image is located on the vm-host
    // so we send the auth command to the vm-host instead of the image storage.
    // This enables using a SAN backend with dedicated volumes per vm-host which all
    // contain all "golden-images" which are used for snapshotting.
    // We do this to overcome the current lvm limitation of not supporting cluster-wide snapshots
    // get the vm resource
    $vm_resource = new resource();
    $vm_resource->get_instance_by_id($cloudimage->resource_id);
    // get the lxc host
    $vm_host_resource = new resource();
    $vm_host_resource->get_instance_by_id($vm_resource->vhostid);
    // san backend ?
    if ($vm_host_resource->id != $resource->id) {
        $event->log("create_clone_kvm_lvm_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-lvm-deployment-cloud-hook.php", "Image " . $image_id . " IS NOT available on this kvm host, " . $resource->id . " not equal " . $vm_host_resource->id . " !! Assuming SAN Backend", "", "", 0, 0, 0);
        // update the image storage id with the vm-host-resource
        $image_deployment = new deployment();
        $image_deployment->get_instance_by_type($image_type);
        // loop over all storage id from type $image_type
        $found_image = 0;
        $storage_list_by_type = new storage();
        $storage_id_list_by_type = $storage_list_by_type->get_ids_by_storage_type($image_deployment->id);
        foreach ($storage_id_list_by_type as $storage_id_list) {
            $storage_id = $storage_id_list['storage_id'];
            $tstorage = new storage();
            $tstorage->get_instance_by_id($storage_id);
            if ($tstorage->resource_id == $vm_host_resource->id) {
                // re-create update array + new storage id
                $ar_image_update = array('image_rootdevice' => "/dev/" . $volume_group . "/" . $image_clone_name, 'image_storageid' => $tstorage->id);
                $event->log("create_clone_kvm_lvm_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-lvm-deployment-cloud-hook.php", "Updating Image " . $image_id . " / " . $image_name . " with storage id " . $tstorage->id . ".", "", "", 0, 0, 0);
                $found_image = 1;
                break;
            }
        }
        if ($found_image == 0) {
            $event->log("create_clone_kvm_lvm_deployment", $_SERVER['REQUEST_TIME'], 2, "openqrm-kvm-lvm-deployment-cloud-hook.php", "SETUP ERROR: Could not find a storage server type " . $image_type . " using resource " . $vm_host_resource->id . ". Please create one!", "", "", 0, 0, 0);
            $event->log("create_clone_kvm_lvm_deployment", $_SERVER['REQUEST_TIME'], 2, "openqrm-kvm-lvm-deployment-cloud-hook.php", "SETUP ERROR: Not cloning image " . $image_id . ".", "", "", 0, 0, 0);
            return;
        }
    } else {
        $event->log("create_clone_kvm_lvm_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-lvm-deployment-cloud-hook.php", "Image " . $image_id . " IS available on this kvm host, " . $resource->id . " equal " . $vm_host_resource->id . ".", "", "", 0, 0, 0);
    }
    $event->log("create_clone_kvm_lvm_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-lvm-deployment-cloud-hook.php", "Updating rootdevice of image " . $image_id . " / " . $image_name . " with /dev/" . $volume_group . "/" . $image_clone_name, "", "", 0, 0, 0);
    $image->update($image_id, $ar_image_update);
    $image_clone_cmd = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/kvm/bin/openqrm-kvm " . $kvm_plugin_cloud_create_volume_action . " -n " . $image_location_name . " -v " . $volume_group . " -s " . $image_clone_name . " -m " . $disk_size . " -t " . $deployment->type . " -u " . $openqrm_admin_user->name . " -p " . $openqrm_admin_user->password . " --openqrm-cmd-mode background";
    $event->log("create_clone_kvm_lvm_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-lvm-deployment-cloud-hook.php", "Running : " . $image_clone_cmd, "", "", 0, 0, 0);
    $resource->send_command($vm_host_resource->ip, $image_clone_cmd);
}
コード例 #9
0
 function add()
 {
     $response = $this->get_response();
     $form = $response->form;
     $errors = array();
     if (!$form->get_errors() && $this->response->submit()) {
         $image_id = $form->get_request('ami_image_id');
         $image = new image();
         if (isset($image_id) && $image_id !== '') {
             $image->get_instance_by_id($image_id);
         } else {
             $errors[] = $this->lang['error_boot'];
         }
         if (count($errors) > 0 || $form->get_errors()) {
             $response->error = join('<br>', $errors);
         } else {
             $tables = $this->openqrm->get('table');
             $custom_script_parameter = '';
             $custom_script = $form->get_request('custom_script');
             if (strlen($custom_script)) {
                 $custom_script_parameter = ' -ic ' . $custom_script;
             }
             $custom_name = $form->get_request('name');
             $resource = new resource();
             $id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0"));
             if (strlen($custom_name)) {
                 $name = $custom_name;
             } else {
                 $name = $this->hc->account_type . $id;
             }
             $ip = "0.0.0.0";
             $resource->generate_mac();
             $mac = $resource->mac;
             // send command to the openQRM-server
             $openqrm = new openqrm_server();
             $openqrm->send_command('openqrm_server_add_resource ' . $id . ' ' . $mac . ' ' . $ip);
             // set resource type
             $virtualization = new virtualization();
             $virtualization->get_instance_by_type("hybrid-cloud-vm-local");
             // add to openQRM database
             $fields["resource_id"] = $id;
             $fields["resource_ip"] = $ip;
             $fields["resource_mac"] = $mac;
             $fields["resource_hostname"] = $name;
             $fields["resource_localboot"] = 0;
             $fields["resource_vtype"] = $virtualization->id;
             $fields["resource_vhostid"] = 0;
             $fields["resource_image"] = $image->name;
             $fields["resource_imageid"] = $image->id;
             $rfields["resource_kernel"] = 'default';
             $rfields["resource_kernelid"] = 1;
             $resource->add($fields);
             $resource->get_instance_by_mac($mac);
             // set account id in resource capabilities
             $resource->set_resource_capabilities("HCACL", $this->hc->id);
             $hc_authentication = '';
             if ($this->hc->account_type == 'aws' || $this->hc->account_type == 'euca') {
                 $hc_authentication .= ' -O ' . $this->hc->access_key;
                 $hc_authentication .= ' -W ' . $this->hc->secret_key;
                 $hc_authentication .= ' -ir ' . $this->region;
                 $hc_authentication .= ' -iz ' . $form->get_request('availability_zone');
             }
             if ($this->hc->account_type == 'lc-openstack') {
                 $hc_authentication .= ' -u ' . $this->hc->username;
                 $hc_authentication .= ' -p ' . $this->hc->password;
                 $hc_authentication .= ' -q ' . $this->hc->host;
                 $hc_authentication .= ' -x ' . $this->hc->port;
                 $hc_authentication .= ' -g ' . $this->hc->tenant;
                 $hc_authentication .= ' -e ' . $this->hc->endpoint;
             }
             $command = $this->openqrm->get('basedir') . '/plugins/hybrid-cloud/bin/openqrm-hybrid-cloud-vm create';
             $command .= ' -i ' . $this->hc->id;
             $command .= ' -n ' . $this->hc->account_name;
             $command .= ' -t ' . $this->hc->account_type;
             $command .= $hc_authentication;
             $command .= ' -in ' . $name;
             $command .= ' -im ' . $mac;
             $command .= ' -a ' . $image->name;
             $command .= ' -it ' . $form->get_request('type');
             $command .= ' -ik ' . $form->get_request('keypair');
             if ($this->hc->account_type == 'aws') {
                 $command .= ' -subnet ' . $form->get_request('subnet');
             } else {
                 $command .= ' -ig ' . $form->get_request('group');
             }
             $command .= ' --openqrm-ui-user ' . $this->user->name;
             $command .= ' --openqrm-cmd-mode background';
             $command .= $custom_script_parameter;
             $openqrm->send_command($command, NULL, true);
             // check to have a ip from the dhcpd-resource hook
             while ($resource->ip == "0.0.0.0") {
                 sleep(1);
                 clearstatcache();
                 $resource->get_instance_by_mac($mac);
             }
             // save the mgmt ip in the resource network field
             $rufields["resource_network"] = $resource->ip;
             $resource->update_info($resource->id, $rufields);
             $response->resource_id = $id;
             $response->msg = sprintf($this->lang['msg_added'], $name);
             // auto create the appliance for this VM if we are not coming from the wizard
             if (isset($this->user->wizard_name) && $this->user->wizard_name === 'appliance' && $this->user->wizard_step == 2) {
                 $now = 1;
             } else {
                 $now = $_SERVER['REQUEST_TIME'];
                 $appliance = new appliance();
                 $new_appliance_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0"));
                 $afields['appliance_id'] = $new_appliance_id;
                 $afields['appliance_name'] = $name;
                 $afields['appliance_resources'] = $id;
                 $afields['appliance_kernelid'] = '1';
                 $afields['appliance_imageid'] = $image->id;
                 $afields["appliance_virtual"] = 0;
                 $afields["appliance_virtualization"] = $virtualization->id;
                 $afields['appliance_wizard'] = '';
                 $afields['appliance_comment'] = 'Cloud VM Server for Resource ' . $id;
                 $appliance->add($afields);
                 // update state/start+stoptime
                 $aufields['appliance_stoptime'] = $now;
                 $aufields['appliance_starttime'] = '';
                 $aufields['appliance_state'] = 'stopped';
                 $appliance->update($new_appliance_id, $aufields);
                 // set image active
                 $image_fields["image_id"] = $image->id;
                 $image_fields['image_isactive'] = 1;
                 $image->update($image->id, $image_fields);
             }
         }
     }
     return $response;
 }
コード例 #10
0
function create_clone_kvm_bf_deployment($cloud_image_id, $image_clone_name, $disk_size)
{
    global $OPENQRM_SERVER_BASE_DIR;
    global $OPENQRM_SERVER_IP_ADDRESS;
    global $OPENQRM_EXEC_PORT;
    global $RESOURCE_INFO_TABLE;
    global $event;
    // we got the cloudimage id here, get the image out of it
    $cloudimage = new cloudimage();
    $cloudimage->get_instance_by_id($cloud_image_id);
    $event->log("create_clone_kvm_bf_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-bf-deployment-cloud-hook.php", "Creating clone " . $image_clone_name . " of image " . $cloudimage->image_id . " on the storage", "", "", 0, 0, 0);
    // get image, this is already the new logical clone
    // we just need to physical snapshot it and update the rootdevice
    $image = new image();
    $image->get_instance_by_id($cloudimage->image_id);
    $image_id = $image->id;
    $image_name = $image->name;
    $image_type = $image->type;
    $image_version = $image->version;
    $image_rootdevice = $image->rootdevice;
    $image_rootfstype = $image->rootfstype;
    $imageid = $image->storageid;
    $image_isshared = $image->isshared;
    $image_comment = $image->comment;
    $image_capabilities = $image->capabilities;
    $image_deployment_parameter = $image->deployment_parameter;
    $openqrm_admin_user = new user("openqrm");
    $openqrm_admin_user->set_user();
    // get image storage
    $storage = new storage();
    $storage->get_instance_by_id($imageid);
    $storage_resource_id = $storage->resource_id;
    // get deployment type
    $deployment = new deployment();
    $deployment->get_instance_by_id($storage->type);
    // get storage resource
    $resource = new resource();
    $resource->get_instance_by_id($storage_resource_id);
    $resource_id = $resource->id;
    $resource_ip = $resource->ip;
    // kvm-bf-deployment
    $image->get_instance_by_id($image_id);
    // parse the identifiers
    // origin image volume name
    $origin_volume_name = basename($image_rootdevice);
    // location of the volume (path)
    $image_location_name = dirname($image_rootdevice);
    // set default snapshot size
    if (!strlen($disk_size)) {
        $disk_size = 5000;
    }
    // update the image rootdevice parameter
    $ar_image_update = array('image_rootdevice' => $image_location_name . "/" . $image_clone_name);
    // For kvm vms we assume that the image is located on the vm-host
    // so we send the auth command to the vm-host instead of the image storage.
    // This enables using a NAS/Glusterfs backend with all volumes accessible for all hosts
    // get the vm resource
    $vm_resource = new resource();
    $vm_resource->get_instance_by_id($cloudimage->resource_id);
    // get the lxc host
    $vm_host_resource = new resource();
    $vm_host_resource->get_instance_by_id($vm_resource->vhostid);
    // san backend ?
    if ($vm_host_resource->id != $resource->id) {
        $event->log("create_clone_kvm_bf_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-bf-deployment-cloud-hook.php", "Image " . $image_id . " IS NOT available on this kvm host, " . $resource->id . " not equal " . $vm_host_resource->id . " !! Assuming SAN Backend", "", "", 0, 0, 0);
        // update the image storage id with the vm-host-resource
        $image_deployment = new deployment();
        $image_deployment->get_instance_by_type($image_type);
        // loop over all storage id from type $image_type
        $found_image = 0;
        $storage_list_by_type = new storage();
        $storage_id_list_by_type = $storage_list_by_type->get_ids_by_storage_type($image_deployment->id);
        foreach ($storage_id_list_by_type as $storage_id_list) {
            $storage_id = $storage_id_list['storage_id'];
            $tstorage = new storage();
            $tstorage->get_instance_by_id($storage_id);
            if ($tstorage->resource_id == $vm_host_resource->id) {
                // re-create update array + new storage id
                $ar_image_update = array('image_rootdevice' => $image_location_name . "/" . $image_clone_name, 'image_storageid' => $tstorage->id);
                $event->log("create_clone_kvm_bf_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-bf-deployment-cloud-hook.php", "Updating Image " . $image_id . " / " . $image_name . " with storage id " . $tstorage->id . ".", "", "", 0, 0, 0);
                $found_image = 1;
                break;
            }
        }
        if ($found_image == 0) {
            $event->log("create_clone_kvm_bf_deployment", $_SERVER['REQUEST_TIME'], 2, "openqrm-kvm-bf-deployment-cloud-hook.php", "SETUP ERROR: Could not find a storage server type " . $image_type . " using resource " . $vm_host_resource->id . ". Please create one!", "", "", 0, 0, 0);
            $event->log("create_clone_kvm_bf_deployment", $_SERVER['REQUEST_TIME'], 2, "openqrm-kvm-bf-deployment-cloud-hook.php", "SETUP ERROR: Not cloning image " . $image_id . ".", "", "", 0, 0, 0);
            return;
        }
    } else {
        $event->log("create_clone_kvm_bf_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-bf-deployment-cloud-hook.php", "Image " . $image_id . " IS available on this kvm host, " . $resource->id . " equal " . $vm_host_resource->id . ".", "", "", 0, 0, 0);
    }
    $event->log("create_clone_kvm_bf_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-bf-deployment-cloud-hook.php", "Updating rootdevice of image " . $image_id . " / " . $image_name . " with " . $image_location_name . "/" . $image_clone_name, "", "", 0, 0, 0);
    $image->update($image_id, $ar_image_update);
    $image_clone_cmd = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/kvm/bin/openqrm-kvm snap -n " . $origin_volume_name . " -v " . $image_location_name . " -s " . $image_clone_name . " -m " . $disk_size . " -t " . $deployment->type . " -u " . $openqrm_admin_user->name . " -p " . $openqrm_admin_user->password . " --openqrm-cmd-mode background";
    $event->log("create_clone_kvm_bf_deployment", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-bf-deployment-cloud-hook.php", "Running : " . $image_clone_cmd, "", "", 0, 0, 0);
    $resource->send_command($vm_host_resource->ip, $image_clone_cmd);
}
コード例 #11
0
function create_clone_lvm_aoe_deployment($cloud_image_id, $image_clone_name, $disk_size)
{
    global $OPENQRM_SERVER_BASE_DIR;
    global $OPENQRM_SERVER_IP_ADDRESS;
    global $OPENQRM_EXEC_PORT;
    global $RESOURCE_INFO_TABLE;
    global $event;
    global $BaseDir;
    $event->log("create_clone", $_SERVER['REQUEST_TIME'], 5, "lvm-aoe-deployment-cloud-hook", "Creating clone of image on storage", "", "", 0, 0, 0);
    // we got the cloudimage id here, get the image out of it
    $cloudimage = new cloudimage();
    $cloudimage->get_instance_by_id($cloud_image_id);
    // get image, this is already the new logical clone
    // we just need to physical snapshot it and update the rootdevice
    $image = new image();
    $image->get_instance_by_id($cloudimage->image_id);
    $image_id = $image->id;
    $image_name = $image->name;
    $image_type = $image->type;
    $image_version = $image->version;
    $image_rootdevice = $image->rootdevice;
    $image_rootfstype = $image->rootfstype;
    $image_storageid = $image->storageid;
    $image_isshared = $image->isshared;
    $image_comment = $image->comment;
    $image_capabilities = $image->capabilities;
    $image_deployment_parameter = $image->deployment_parameter;
    // get image storage
    $storage = new storage();
    $storage->get_instance_by_id($image_storageid);
    $storage_resource_id = $storage->resource_id;
    // get storage resource
    $resource = new resource();
    $resource->get_instance_by_id($storage_resource_id);
    $resource_id = $resource->id;
    $resource_ip = $resource->ip;
    // parse the volume group info in the identifier
    $ident_separate = strpos($image_rootdevice, ":");
    $volume_group = substr($image_rootdevice, 0, $ident_separate);
    $image_rootdevice_rest = substr($image_rootdevice, $ident_separate + 1);
    $ident_separate2 = strpos($image_rootdevice_rest, ":");
    $image_location_name = substr($image_rootdevice_rest, 0, $ident_separate2);
    $root_device = substr($image_rootdevice_rest, $ident_separate2 + 1);
    // set default snapshot size
    if (!strlen($disk_size)) {
        $disk_size = 5000;
    }
    $image_clone_cmd = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/lvm-storage/bin/openqrm-lvm-storage snap -n " . $image_location_name . " -v " . $volume_group . " -t lvm-aoe-deployment -s " . $image_clone_name . " -m " . $disk_size . " --openqrm-cmd-mode background";
    $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "lvm-aoe-deployment-cloud-hook", "Running : {$image_clone_cmd}", "", "", 0, 0, 0);
    $resource->send_command($resource_ip, $image_clone_cmd);
    // wait for clone
    sleep(4);
    // find the new rootdevice of the snapshot, get it via the storage-ident hook
    $rootdevice_identifier_hook = "{$BaseDir}/boot-service/image.lvm-aoe-deployment.php";
    // require once
    require_once "{$rootdevice_identifier_hook}";
    $rootdevice_identifier_arr = array();
    $rootdevice_identifier_arr = get_lvm_aoe_deployment_image_rootdevice_identifier($image->storageid);
    foreach ($rootdevice_identifier_arr as $id) {
        foreach ($id as $aoe_identifier_string) {
            if (strstr($aoe_identifier_string, $image_clone_name)) {
                $aoe_clone_rootdevice_tmp = strrchr($aoe_identifier_string, ":");
                $aoe_clone_rootdevice = trim(str_replace(":", "", $aoe_clone_rootdevice_tmp));
                break;
            }
        }
    }
    // update the image rootdevice parameter
    $ar_image_update = array('image_rootdevice' => "{$volume_group}:{$image_clone_name}:{$aoe_clone_rootdevice}");
    $image->update($image_id, $ar_image_update);
    $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "lvm-aoe-deployment-cloud-hook", "Updating rootdevice of image {$image_id} / {$image_name} with {$volume_group}:{$image_clone_name}:{$aoe_clone_rootdevice}", "", "", 0, 0, 0);
}