function create_clone_lvm_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, "lvm-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_password = $image->generatePassword(12); $image->set_deployment_parameters("IMAGE_ISCSI_AUTH", $image_password); // parse the volume group info in the identifier $ident_separate = strpos($image_rootdevice, ":"); $volume_group = substr($image_rootdevice, 0, $ident_separate); $root_device = substr($image_rootdevice, $ident_separate); $image_location = dirname($root_device); $image_location_name = basename($image_location); // set default snapshot size if (!strlen($disk_size)) { $disk_size = 5000; } // update the image rootdevice parameter $ar_image_update = array('image_rootdevice' => "{$volume_group}:/dev/{$image_clone_name}/1"); $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "lvm-iscsi-deployment-cloud-hook", "Updating rootdevice of image {$image_id} / {$image_name} with {$volume_group}:/dev/{$image_clone_name}/1", "", "", 0, 0, 0); $image->update($image_id, $ar_image_update); // send command $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-iscsi-deployment -s " . $image_clone_name . " -m " . $disk_size . " -i " . $image_password . " --openqrm-cmd-mode background"; $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "lvm-iscsi-deployment-cloud-hook", "Running : {$image_clone_cmd}", "", "", 0, 0, 0); $resource->send_command($resource_ip, $image_clone_cmd); }
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; }
function openqrm_linuxcoe_appliance($cmd, $appliance_fields) { global $event; global $OPENQRM_SERVER_BASE_DIR; global $OPENQRM_SERVER_IP_ADDRESS; global $OPENQRM_EXEC_PORT; $openqrm_server = new openqrm_server(); $appliance_id = $appliance_fields["appliance_id"]; $appliance_name = $appliance_fields["appliance_name"]; $resource = new resource(); $resource->get_instance_by_id($appliance_fields["appliance_resources"]); $resource_mac = $resource->mac; $resource_ip = $resource->ip; $appliance = new appliance(); $appliance->get_instance_by_id($appliance_id); $linuxcoe_install_timeout = 240; // check appliance values, maybe we are in update and they are incomplete if ($appliance->imageid == 1) { return; } if ($resource->id == "-1" || $resource->id == "") { return; } // check if image is type linuxcoe-deployment $image = new image(); $image->get_instance_by_id($appliance->imageid); // linuxcoe configured in image deployment parameters ? $linuxcoe_auto_install_enabled = false; $linuxcoe_deployment_parameters = trim($image->get_deployment_parameter("INSTALL_CONFIG")); if (strlen($linuxcoe_deployment_parameters)) { $linuxcoe_deployment_parameter_arr = explode(":", $linuxcoe_deployment_parameters); $local_deployment_persistent = $linuxcoe_deployment_parameter_arr[0]; $local_deployment_type = $linuxcoe_deployment_parameter_arr[1]; if (strcmp($local_deployment_type, "linuxcoe-deployment")) { $event->log("openqrm_linuxcoe_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-linuxcoe-appliance-hook.php", "Appliance " . $appliance_id . "/" . $appliance_name . " image is not from type linuxcoe-deployment", "", "", 0, 0, $resource->id); return; } $linuxcoe_server_storage_id = $linuxcoe_deployment_parameter_arr[2]; $linuxcoe_install_profile = $linuxcoe_deployment_parameter_arr[3]; $linuxcoe_auto_install_enabled = true; } $event->log("openqrm_linuxcoe_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-linuxcoe-appliance-hook.php", "Handling {$cmd} event {$appliance_id}/{$appliance_name}/{$resource_ip}/{$resource_mac}", "", "", 0, 0, $resource->id); switch ($cmd) { case "start": $event->log("openqrm_linuxcoe_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-linuxcoe-appliance-hook.php", "START event {$appliance_id}/{$appliance_name}/{$resource_ip}/{$resource_mac}", "", "", 0, 0, $resource->id); if ($linuxcoe_auto_install_enabled) { // prepare automatic-installation / transfer client to linuxcoe server $linuxcoe_command = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/linuxcoe/bin/openqrm-linuxcoe-manager transfer_to_linuxcoe -x " . $resource->id . " -i " . $resource_ip . " -m " . $resource_mac . " -n " . $linuxcoe_install_profile . " --openqrm-cmd-mode background"; $event->log("openqrm_linuxcoe_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-linuxcoe-appliance-hook.php", "transfer_to_linuxcoe {$resource_ip} / {$linuxcoe_install_profile}", "", "", 0, 0, $resource->id); $openqrm_server->send_command($linuxcoe_command, NULL, true); // Remove image-deployment paramters, if auto-install is a single-shot actions if (!strcmp($local_deployment_persistent, "0")) { $image->set_deployment_parameters("INSTALL_CONFIG", ""); } // create linuxcoestate-state object to allow to run a late setboot to local command on the vm host $linuxcoe_state = new linuxcoestate(); $linuxcoe_state->remove_by_resource_id($resource->id); $linuxcoe_state_fields = array(); $linuxcoe_state_fields["linuxcoe_id"] = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $linuxcoe_state_fields["linuxcoe_resource_id"] = $resource->id; $linuxcoe_state_fields["linuxcoe_install_start"] = $_SERVER['REQUEST_TIME']; $linuxcoe_state_fields["linuxcoe_timeout"] = $linuxcoe_install_timeout; $linuxcoe_state->add($linuxcoe_state_fields); } else { if (strcmp($image->type, "linuxcoe-deployment")) { $event->log("openqrm_linuxcoe_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-linuxcoe-appliance-hook.php", "Appliance {$appliance_id}/{$appliance_name} image is not from type linuxcoe-deployment", "", "", 0, 0, $resource->id); } else { // we have auto-installed already, if it is VM the linuxcoeresource object will care to set the boot-sequence on the VM Host to local boot $linuxcoeresource = new linuxcoeresource(); $linuxcoeresource->set_boot($resource->id, 1); // set pxe config to local-boot $event->log("openqrm_linuxcoe_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-linuxcoe-appliance-hook.php", "Setting resource {$resource_ip} to local-boot", "", "", 0, 0, $resource->id); $linuxcoe_command = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/linuxcoe/bin/openqrm-linuxcoe-manager set_linuxcoe_client_to_local_boot -m " . $resource_mac . " --openqrm-cmd-mode background"; $openqrm_server->send_command($linuxcoe_command, NULL, true); } } break; case "stop": if (strcmp($image->type, "linuxcoe-deployment")) { $event->log("stop", $_SERVER['REQUEST_TIME'], 5, "openqrm-linuxcoe-appliance-hook.php", "Appliance {$appliance_id}/{$appliance_name} image is not from type linuxcoe-deployment", "", "", 0, 0, $resource->id); } else { $event->log("stop", $_SERVER['REQUEST_TIME'], 5, "openqrm-linuxcoe-appliance-hook.php", "Stop event for appliance " . $appliance_id . "/" . $appliance->name . ".", "", "", 0, 0, $resource->id); // remove linuxcoestate-state object if existing $local_storage_state = new linuxcoestate(); $local_storage_state->remove_by_resource_id($resource->id); // if it is VM the linuxcoeresource object will care to set the boot-sequence on the VM Host to network boot $linuxcoeresource = new linuxcoeresource(); $linuxcoeresource->set_boot($resource->id, 0); } break; } }
function storage_auth_stop($image_id) { global $event; global $OPENQRM_SERVER_BASE_DIR; global $OPENQRM_SERVER_IP_ADDRESS; global $OPENQRM_EXEC_PORT; $image = new image(); $image->get_instance_by_id($image_id); $image_name = $image->name; $image_rootdevice = $image->rootdevice; // generate a password for the image $image_password = $image->generatePassword(12); $image_deployment_parameter = $image->deployment_parameter; $storage = new storage(); $storage->get_instance_by_id($image->storageid); $storage_resource = new resource(); $storage_resource->get_instance_by_id($storage->resource_id); $storage_ip = $storage_resource->ip; $deployment = new deployment(); $deployment->get_instance_by_type($image->type); $deployment_type = $deployment->type; $deployment_plugin_name = $deployment->storagetype; $event->log("storage_auth_stop_in_background", $_SERVER['REQUEST_TIME'], 5, "openqrm-iscsi-deployment-auth-hook.php", "Authenticating {$image_name} / {$image_rootdevice} with password {$image_password}", "", "", 0, 0, $appliance_id); $auth_stop_cmd = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/" . $deployment_plugin_name . "/bin/openqrm-" . $deployment_plugin_name . " auth -r " . $image_rootdevice . " -i " . $image_password . " --openqrm-cmd-mode background"; $resource = new resource(); $resource->send_command($storage_ip, $auth_stop_cmd); // and update the image params $image->set_deployment_parameters("IMAGE_ISCSI_AUTH", $image_password); }
function storage_auth_stop($image_id) { global $event; global $OPENQRM_SERVER_BASE_DIR; global $OPENQRM_SERVER_IP_ADDRESS; global $OPENQRM_EXEC_PORT; $image = new image(); $image->get_instance_by_id($image_id); $image_name = $image->name; $image_rootdevice = $image->rootdevice; // generate a password for the image $image_password = $image->generatePassword(12); $image_deployment_parameter = $image->deployment_parameter; // parse the volume group info in the identifier $ident_separate = strpos($image_rootdevice, ":"); $volume_group = substr($image_rootdevice, 0, $ident_separate); $root_device = substr($image_rootdevice, $ident_separate); $image_location = dirname($root_device); $image_location_name = basename($image_location); $storage = new storage(); $storage->get_instance_by_id($image->storageid); $storage_resource = new resource(); $storage_resource->get_instance_by_id($storage->resource_id); $storage_ip = $storage_resource->ip; $deployment = new deployment(); $deployment->get_instance_by_type($image->type); $deployment_type = $deployment->type; $deployment_plugin_name = $deployment->storagetype; $auth_stop_cmd = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/" . $deployment_plugin_name . "/bin/openqrm-" . $deployment_plugin_name . " auth -r /dev/" . $volume_group . "/" . $image_location_name . " -i " . $image_password . " -t lvm-iscsi-deployment --openqrm-cmd-mode background"; $resource = new resource(); $resource->send_command($storage_ip, $auth_stop_cmd); // and update the image params $image->set_deployment_parameters("IMAGE_ISCSI_AUTH", $image_password); }
function check_all_image_authentication() { global $IMAGE_AUTHENTICATION_TABLE; global $event; global $RootDir; // $event->log("check_all_image_authentication", $_SERVER['REQUEST_TIME'], 5, "image_authentication.class.php", "Checking all image_authentications", "", "", 0, 0, 0); $ia_id_ar = $this->get_all_ids(); foreach ($ia_id_ar as $ia_list) { $ia_auth_id = $ia_list['ia_id']; $ia_auth = new image_authentication(); $ia_auth->get_instance_by_id($ia_auth_id); $event->log("check_all_image_authentication", $_SERVER['REQUEST_TIME'], 5, "image_authentication.class.php", "Checking image_authentication {$ia_auth_id}", "", "", 0, 0, 0); // get data $image = new image(); $image->get_instance_by_id($ia_auth->image_id); $image_name = $image->name; $image_id = $image->id; $deployment = new deployment(); $deployment->get_instance_by_type($image->type); $deployment_type = $deployment->type; $deployment_plugin_name = $deployment->storagetype; $storage_auth_hook = "{$RootDir}/plugins/{$deployment_plugin_name}/openqrm-{$deployment_type}-auth-hook.php"; $resource_id = $ia_auth->resource_id; $resource = new resource(); $resource->get_instance_by_id($resource_id); // check for root or deployment auth switch ($ia_auth->auth_type) { case 0: // run storage_auth_stop (rootfs) if (!strcmp($resource->state, "active") && $resource->imageid == 1) { $event->log("check_all_image_authentication", $_SERVER['REQUEST_TIME'], 5, "image_authentication.class.php", "Resource {$resource_id} idle again, stop-auth {$image_name} ({$image_id})", "", "", 0, 0, $resource_id); // include storage-plugin auth-hook if (file_exists($storage_auth_hook)) { $event->log("check_all_image_authentication", $_SERVER['REQUEST_TIME'], 5, "image_authentication.class.php", "Deployment type {$deployment_type} handling stop-auth hook {$image_id}.", "", "", 0, 0, $resource_id); require_once "{$storage_auth_hook}"; storage_auth_stop($image->id); // remove image_authentication $ia_auth->remove($ia_auth_id); } } else { // resource is still on rebooting $event->log("check_all_image_authentication", $_SERVER['REQUEST_TIME'], 5, "image_authentication.class.php", "Resource {$resource_id} still rebooting, waiting for stop-auth {$image_name}", "", "", 0, 0, $resource_id); } break; case 1: // run storage_auth_stop (deployment export) // we stop the deployment hook when the resource is active or active/idle // -> in both states it for sure does not need the deployment mount any more if (!strcmp($resource->state, "active")) { $event->log("check_all_image_authentication", $_SERVER['REQUEST_TIME'], 5, "image_authentication.class.php", "Resource {$resource_id} active, stop-deployment auth {$image_name}", "", "", 0, 0, $resource_id); // include storage-plugin auth-hook if (file_exists($storage_auth_hook)) { $event->log("check_all_image_authentication", $_SERVER['REQUEST_TIME'], 5, "image_authentication.class.php", "Deployment type {$deployment_type} handling stop-deployment auth hook {$image_id}.", "", "", 0, 0, $resource_id); require_once "{$storage_auth_hook}"; storage_auth_deployment_stop($image->id); $image->get_instance_by_id($ia_auth->image_id); $image_name = $image->name; $image_id = $image->id; // remove all install from or transfer to deployment parameters $image->set_deployment_parameters("IMAGE_INSTALL_FROM_NFS", ""); $image->set_deployment_parameters("IMAGE_TRANSFER_TO_NFS", ""); $image->set_deployment_parameters("IMAGE_INSTALL_FROM_LOCAL", ""); $image->set_deployment_parameters("IMAGE_TRANSFER_TO_LOCAL", ""); // remove image_authentication $ia_auth->remove($ia_auth_id); } } else { // resource is still on rebooting $event->log("check_all_image_authentication", $_SERVER['REQUEST_TIME'], 5, "image_authentication.class.php", "Resource {$resource_id} is still rebooting, waiting for stop-deployment auth {$image_name}", "", "", 0, 0, $resource_id); } break; } } }