diff --git a/src/image/Image.cc b/src/image/Image.cc index 5fdabc1828..4ab57a7cde 100644 --- a/src/image/Image.cc +++ b/src/image/Image.cc @@ -132,19 +132,33 @@ int Image::insert(SqlDB *db, string& error_str) erase_template_attribute("PERSISTENT", persistent_attr); - TO_UPPER(persistent_attr); + if ( type != DATAFILE ) + { + TO_UPPER(persistent_attr); - persistent_img = (persistent_attr == "YES"); + persistent_img = (persistent_attr == "YES"); + } + else // Files are always non-persistent + { + persistent_img = false; + } // ------------ PREFIX -------------------- - get_template_attribute("DEV_PREFIX", dev_prefix); - - if( dev_prefix.empty() ) + if ( type != DATAFILE ) { - SingleAttribute * dev_att = new SingleAttribute("DEV_PREFIX", - ImagePool::default_dev_prefix()); - obj_template->set(dev_att); + get_template_attribute("DEV_PREFIX", dev_prefix); + + if( dev_prefix.empty() ) + { + SingleAttribute * dev_att = new SingleAttribute("DEV_PREFIX", + ImagePool::default_dev_prefix()); + obj_template->set(dev_att); + } + } + else // Do not set dev_prefix for files + { + erase_template_attribute("DEV_PREFIX", dev_prefix); } // ------------ SIZE -------------------- diff --git a/src/image/ImageManagerActions.cc b/src/image/ImageManagerActions.cc index e2979c791c..a2a3d144b5 100644 --- a/src/image/ImageManagerActions.cc +++ b/src/image/ImageManagerActions.cc @@ -88,6 +88,12 @@ int ImageManager::acquire_image(int vm_id, Image *img, string& error) { int rc = 0; + if ( img->get_type() == Image::DATAFILE ) + { + error = "Image of type FILE cannot be used as DISK."; + return -1; + } + switch (img->get_state()) { case Image::READY: @@ -149,6 +155,14 @@ void ImageManager::release_image(int vm_id, int iid, bool failed) return; } + if ( img->get_type() == Image::DATAFILE ) + { + NebulaLog::log("ImM", Log::ERROR, "Trying to release a FILE image"); + + img->unlock(); + return; + } + switch (img->get_state()) { case Image::USED_PERS: @@ -238,6 +252,14 @@ void ImageManager::release_cloning_image(int iid, int clone_img_id) return; } + if ( img->get_type() == Image::DATAFILE ) + { + NebulaLog::log("ImM", Log::ERROR, "Trying to release a cloning FILE image"); + + img->unlock(); + return; + } + switch (img->get_state()) { case Image::USED: diff --git a/src/image/ImagePool.cc b/src/image/ImagePool.cc index d39be52c49..5481f88d24 100644 --- a/src/image/ImagePool.cc +++ b/src/image/ImagePool.cc @@ -116,6 +116,7 @@ int ImagePool::allocate ( { goto error_types_missmatch_image; } + img_aux = get(name,uid,false); if( img_aux != 0 ) @@ -135,7 +136,6 @@ int ImagePool::allocate ( goto error_clone_state; } - img->set_cloning_id(cloning_id); } @@ -197,11 +197,11 @@ error_name_length: goto error_common; error_types_missmatch_file: - oss << "Only IMAGES of type FILE can be registered in FILE_DS Datastore"; + oss << "Only IMAGES of type FILE can be registered in a FILE_DS datastore"; goto error_common; error_types_missmatch_image: - oss << "IMAGES of type FILE can be registered in IMAGE_DS Datastore"; + oss << "IMAGES of type FILE cannot be registered in a IMAGE_DS datastore"; goto error_common; error_duplicated: diff --git a/src/rm/RequestManagerImage.cc b/src/rm/RequestManagerImage.cc index cf42b1483b..6ef4d2299d 100644 --- a/src/rm/RequestManagerImage.cc +++ b/src/rm/RequestManagerImage.cc @@ -44,11 +44,11 @@ void ImageEnable::request_execute(xmlrpc_c::paramList const& paramList, { if (enable_flag == true) { - err_msg = "Could not enable image"; + err_msg = "Could not enable image."; } else { - err_msg = "Could not disable image"; + err_msg = "Could not disable image."; } failure_response(INTERNAL, request_error(err_msg,""), att); @@ -87,6 +87,15 @@ void ImagePersistent::request_execute(xmlrpc_c::paramList const& paramList, return; } + if ( image->get_type() == Image::DATAFILE ) + { + failure_response(ACTION, + request_error("FILE images must be non-persistent",""), att); + + image->unlock(); + return; + } + rc = image->persistent(persistent_flag, err_msg); if ( rc != 0 ) @@ -142,6 +151,17 @@ void ImageChangeType::request_execute(xmlrpc_c::paramList const& paramList, return; } + if ( image->get_type() == Image::DATAFILE ) + { + failure_response(ACTION, + request_error("Only FILE images can be stored in a FILE_DS" + " datastore.",""), + att); + + image->unlock(); + return; + } + rc = image->set_type(type); if ( rc != 0 ) diff --git a/src/rm/RequestManagerVirtualMachine.cc b/src/rm/RequestManagerVirtualMachine.cc index 84408d0c24..a30d61be8c 100644 --- a/src/rm/RequestManagerVirtualMachine.cc +++ b/src/rm/RequestManagerVirtualMachine.cc @@ -641,6 +641,14 @@ void VirtualMachineSaveDisk::request_execute(xmlrpc_c::paramList const& paramLis return; } + if ( type == Image::DATAFILE ) + { + failure_response(INTERNAL, + request_error("Cannot save_as image of type FILE", ""), + att); + return; + } + // ------------------------------------------------------------------------- // Get the data of the DataStore for the new image // -------------------------------------------------------------------------