1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-23 22:50:09 +03:00

feature #1617: Image of type FILE: are always non-persistent, does not have DEV_PREFIX, cannot be acquired, cannot change type as they live in a FILE_DS.

This commit is contained in:
Ruben S. Montero 2012-11-16 16:36:58 +01:00
parent 8feb9206c4
commit ed9a14077a
5 changed files with 77 additions and 13 deletions

View File

@ -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 --------------------

View File

@ -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:

View File

@ -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:

View File

@ -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 )

View File

@ -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
// -------------------------------------------------------------------------